2011-02-06 63 views
3

C#(Linq to Objects)中是否存在std :: for_each算法模拟,能够将Func<>传递给它?像在C#(Linq to Objects)中是否存在std :: for_each算法模拟

sequence.Each(p => p.Some()); 

代替

foreach(var elem in sequence) 
{ 
    elem.Some(); 
} 
+0

[LINQ相当于foreach for IEnumerable ](http://stackoverflow.com/questions/200574/linq-equivalent-of-foreach-for-ienumerablet) – jdehaan 2011-02-06 07:47:34

+0

的可能重复?是的,谢谢..这就是preatty多回答我的问题! – 2011-02-06 08:31:28

回答

6

C#语言本身有一个foreach声明。

作为Jon hints(和Eric explicitly states),LINQ设计人员希望保持方法无副作用,而ForEach会打破此合同。

有实际一个ForEach方法,做在List<T>Array类适用给出断言,但它是在.NET Framework 2.0中引入LINQ只有3.5来了。他们不相关。

毕竟,你可以随时come up with your own extension method

public static void ForEach<T> (this IEnumerable<T> enumeration, Action<T> action) 
{ 
    foreach (T item in enumeration) 
     action (item); 
} 

我同意这是非常有用的情况下,你已经有了一个参数的方法,你想运行它的每个元素。

var list = new List<int> {1, 2, 3, 4, 5}; 
list.Where (n => n > 3) 
    .ForEach (Console.WriteLine); 

但是在其他情况下,我相信好醇” foreach是更清洁,简洁。

顺便说一句,单参数无效方法不是Func<T>而是Action<T>
Func<T>表示返回T的函数,Action<T>表示接受Tvoid方法。

3

System.Collections.Generic.List<T>有一个方法void ForEach(Action<T> action)其执行每每个列表项所提供的委托。 Array类也暴露了这样一种方法。