我最近开始使用LINQ并且令人惊叹.我想知道LINQ是否允许我将函数 - 任何函数 - 应用于集合的所有元素,而不使用foreach.像python lambda函数之类的东西.
例如,如果我有一个int列表,我可以使用LINQ为每个元素添加一个常量
如果我有一个数据库表,我可以使用LINQ为所有记录设置一个字段.
我正在使用C#
Jon*_*eet 140
解决此问题的常用方法是添加自己的ForEach
通用方法IEnumerable<T>
.这是我们在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);
}
}
Run Code Online (Sandbox Code Playgroud)
(ThrowIfNull
任何引用类型的扩展方法都在哪里,这是显而易见的事情.)
看看这是否是.NET 4.0的一部分会很有趣.它违背了LINQ的功能风格,但毫无疑问,很多人发现它很有用.
一旦你有了,你可以写下这样的东西:
people.Where(person => person.Age < 21)
.ForEach(person => person.EjectFromBar());
Run Code Online (Sandbox Code Playgroud)
mqp*_*mqp 88
使用LINQ执行此操作的惯用方法是处理集合并返回以您想要的方式映射的新集合.例如,要为每个元素添加常量,您需要类似的东西
var newNumbers = oldNumbers.Select(i => i + 8);
Run Code Online (Sandbox Code Playgroud)
以功能方式执行此操作而不是改变现有集合的状态通常可以帮助您以易于阅读和更容易编译器推理的方式分离不同的操作.
如果您实际上想要将一个动作应用于集合的每个元素(具有与集合的实际内容无关的副作用的动作),那么LINQ最适合的不是,尽管您可以伪造它Select
(或者IEnumerable
像许多人一样编写你自己的扩展方法.)foreach
在这种情况下最好坚持使用循环.
Jaa*_*ans 42
您也可以考虑并行,特别是如果您不关心序列,而是更多关于为每个项目完成某些事情:
SomeIEnumerable<T>.AsParallel().ForAll( Action<T> / Delegate / Lambda )
Run Code Online (Sandbox Code Playgroud)
例如:
var numbers = new[] { 1, 2, 3, 4, 5 };
numbers.AsParallel().ForAll( Console.WriteLine );
Run Code Online (Sandbox Code Playgroud)
HTH.
and*_*ndy 31
哈哈,伙计,我刚刚问了几个小时前的这个问题(有点)...试试这个:
例:
someIntList.ForEach(i=>i+5);
Run Code Online (Sandbox Code Playgroud)
ForEach()
是内置的.NET方法之一
这将修改列表,而不是返回新列表.
Jac*_*060 13
或者你可以破解它.
Items.All(p => { p.IsAwesome = true; return true; });
Run Code Online (Sandbox Code Playgroud)
对于不支持的集合,ForEach
可以ForEach
在Parallel
类中使用静态方法:
var options = new ParallelOptions() { MaxDegreeOfParallelism = 1 };
Parallel.ForEach(_your_collection_, options, x => x._Your_Method_());
Run Code Online (Sandbox Code Playgroud)