首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >通过LINQ将函数应用于集合的所有元素

通过LINQ将函数应用于集合的所有元素
EN

Stack Overflow用户
提问于 2009-05-05 05:58:00
回答 8查看 207.7K关注 0票数 150

我最近开始使用LINQ,它太棒了。我想知道LINQ是否允许我在不使用foreach的情况下将一个函数-任何函数-应用于集合的所有元素。类似python的lambda函数。

例如,如果我有一个int列表,我可以使用LINQ向每个元素添加一个常量吗

如果我有一个DB表,我可以使用LINQ为所有记录设置一个字段吗?

我正在使用C#

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-05-05 06:11:07

一种常见的方法是在IEnumerable<T>上添加您自己的ForEach泛型方法。这是我们在MoreLINQ中得到的

代码语言:javascript
复制
public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
    source.ThrowIfNull("source");
    action.ThrowIfNull("action");
    foreach (T element in source)
    {
        action(element);
    }
}

(其中ThrowIfNull是任何引用类型的扩展方法,这是显而易见的。)

看看这是不是.NET 4.0的一部分会很有趣。它与LINQ的函数式风格背道而驰,但毫无疑问,很多人认为它很有用。

一旦你得到了它,你就可以写下这样的东西:

代码语言:javascript
复制
people.Where(person => person.Age < 21)
      .ForEach(person => person.EjectFromBar());
票数 157
EN

Stack Overflow用户

发布于 2009-05-05 06:03:04

使用LINQ的惯用方法是处理集合并返回一个以您想要的方式映射的新集合。例如,要为每个元素添加一个常量,您可能需要如下内容

代码语言:javascript
复制
var newNumbers = oldNumbers.Select(i => i + 8);

以函数式的方式这样做,而不是频繁地改变现有集合的状态,可以帮助您以一种更容易阅读和编译器更容易理解的方式来分离不同的操作。

如果您实际希望将操作应用于集合的每个元素(具有与集合的实际内容无关的副作用的操作),尽管您可以用Select伪造它(或者像许多人那样编写自己的IEnumerable扩展方法),但这并不是LINQ最适合的方法。在这种情况下,最好还是使用foreach循环。

票数 100
EN

Stack Overflow用户

发布于 2012-05-30 15:38:53

你也可以考虑并行,特别是如果你不关心顺序,而是更多地为每一项完成一些事情:

代码语言:javascript
复制
SomeIEnumerable<T>.AsParallel().ForAll( Action<T> / Delegate / Lambda )

例如:

代码语言:javascript
复制
var numbers = new[] { 1, 2, 3, 4, 5 };
numbers.AsParallel().ForAll( Console.WriteLine );

HTH。

票数 46
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/823532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档