我最近开始使用LINQ,它太棒了。我想知道LINQ是否允许我在不使用foreach的情况下将一个函数-任何函数-应用于集合的所有元素。类似python的lambda函数。
例如,如果我有一个int列表,我可以使用LINQ向每个元素添加一个常量吗
如果我有一个DB表,我可以使用LINQ为所有记录设置一个字段吗?
我正在使用C#
发布于 2009-05-05 06:11:07
一种常见的方法是在IEnumerable<T>
上添加您自己的ForEach
泛型方法。这是我们在MoreLINQ中得到的
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的函数式风格背道而驰,但毫无疑问,很多人认为它很有用。
一旦你得到了它,你就可以写下这样的东西:
people.Where(person => person.Age < 21)
.ForEach(person => person.EjectFromBar());
发布于 2009-05-05 06:03:04
使用LINQ的惯用方法是处理集合并返回一个以您想要的方式映射的新集合。例如,要为每个元素添加一个常量,您可能需要如下内容
var newNumbers = oldNumbers.Select(i => i + 8);
以函数式的方式这样做,而不是频繁地改变现有集合的状态,可以帮助您以一种更容易阅读和编译器更容易理解的方式来分离不同的操作。
如果您实际希望将操作应用于集合的每个元素(具有与集合的实际内容无关的副作用的操作),尽管您可以用Select
伪造它(或者像许多人那样编写自己的IEnumerable
扩展方法),但这并不是LINQ最适合的方法。在这种情况下,最好还是使用foreach
循环。
发布于 2012-05-30 15:38:53
你也可以考虑并行,特别是如果你不关心顺序,而是更多地为每一项完成一些事情:
SomeIEnumerable<T>.AsParallel().ForAll( Action<T> / Delegate / Lambda )
例如:
var numbers = new[] { 1, 2, 3, 4, 5 };
numbers.AsParallel().ForAll( Console.WriteLine );
HTH。
https://stackoverflow.com/questions/823532
复制相似问题