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具有相同的最终结果,但(理论上)效率更高,因为它直接将值传递给委托。

ArrayList<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); }