Linq风格“For Each”
可能重复:
Linq相当于IEnumerable的foreach
是否有任何Linq风格的语法为“每个”操作?
例如,将基于一个集合的值添加到另一个已经存在的集合:
IEnumerable<int> someValues = new List<int>() { 1, 2, 3 }; IList<int> list = new List<int>(); someValues.ForEach(x => list.Add(x + 1));
代替
foreach(int value in someValues) { list.Add(value + 1); }
使用ToList()扩展方法是最好的select:
someValues.ToList().ForEach(x => list.Add(x + 1));
BCL中没有直接实现ForEach的扩展方法。
虽然在BCL中没有这样做的扩展方法,但在System
命名空间中仍然有一个选项…如果将Reactive Extensions添加到项目中:
using System.Reactive.Linq; someValues.ToObservable().Subscribe(x => list.Add(x + 1));
这与上面使用ToList
具有相同的最终结果,但(理论上)效率更高,因为它直接将值传递给委托。
Array
和List<T>
类已经有ForEach
方法,但只有这个特定的实现。 (请注意,前者是static
,顺便说一句)。
不知道它确实比foreach
语句提供了一个很好的优势,但是您可以编写一个扩展方法来为所有IEnumerable<T>
对象执行作业。
public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) { foreach (var item in source) action(item); }
这将允许您在问题中发布的确切代码正常工作。
没有任何内置的,但你可以很容易地创build自己的扩展方法来做到这一点:
public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) { if (source == null) throw new ArgumentNullException("source"); if (action == null) throw new ArgumentNullException("action"); foreach (T item in source) { action(item); } }
官方MS行是“因为它不是一个function操作”(即它是一个有状态的操作)。
你不能做这样的事情吗?
list.Select( x => x+1 )
或者如果你真的需要在列表中:
var someValues = new List<int>( list.Select( x => x+1 ) );
在标准Linq中没有这样的东西,但MoreLinq中有一个ForEach运算符。
没有Linq ForEach扩展。 但是,如果您愿意直接使用List
,则List
类具有ForEach方法。
对于什么是值得的,标准的foreach
语法会给你想要的结果,这可能更容易阅读:
foreach (var x in someValues) { list.Add(x + 1); }
如果你坚持,你需要一个Linq风格的扩展。 自己实现这一点是微不足道的。
public static void ForEach<T>(this IEnumerable<T> @this, Action<T> action) { foreach (var x in @this) action(x); }