关于c#:Linq风格“For Each”

Linq style “For Each”

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Linq equivalent of foreach for IEnumerable

对于"for each"操作,是否有LINQ样式的语法?

例如,将基于一个集合的值添加到另一个已存在的集合:

1
2
3
4
5
IEnumerable<int> someValues = new List<int>() { 1, 2, 3 };

IList<int> list = new List<int>();

someValues.ForEach(x => list.Add(x + 1));

而不是

1
2
3
4
foreach(int value in someValues)
{
  list.Add(value + 1);
}


使用tolist()扩展方法是最好的选择:

1
someValues.ToList().ForEach(x => list.Add(x + 1));

BCL中没有直接实现foreach的扩展方法。

虽然在Bcl中没有扩展方法,但是在EDCOX1的0个命名空间中仍然有一个选项…如果在项目中添加反应性扩展:

1
2
3
using System.Reactive.Linq;

someValues.ToObservable().Subscribe(x => list.Add(x + 1));

这与上面使用EDCOX1〔1〕的结果相同,但在理论上是更有效的,因为它直接将值流到委托。


ArrayList类已经有ForEach方法,尽管只有这个特定的实现。(顺便说一下,前者是static)。

不确定它是否真的比ForEach语句提供了很大的优势,但是您可以编写一个扩展方法来为所有IEnumerable对象完成这项工作。

1
2
3
4
5
public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
    foreach (var item in source)
        action(item);
}

这将允许您在问题中发布的确切代码按您的需要工作。


没有任何内置的功能,但您可以轻松创建自己的扩展方法来执行此操作:

1
2
3
4
5
6
7
8
9
10
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行是"因为它不是一个功能操作"(即它是一个状态操作)。

你不能做点什么吗?

1
list.Select( x => x+1 )

或者如果你真的需要它的话:

1
var someValues = new List<int>( list.Select( x => x+1 ) );


没有Linq ForEach扩展。但是,如果您愿意直接使用List,那么List类上有一个foreach方法。

就其价值而言,标准的ForEach语法将为您提供所需的结果,而且可能更容易阅读:

1
2
3
4
foreach (var x in someValues)
{
    list.Add(x + 1);
}

如果您坚定不移,您需要一个Linq样式的扩展。自己实现这一点很简单。

1
2
3
4
5
public static void ForEach<T>(this IEnumerable<T> @this, Action<T> action)
{
   foreach (var x in @this)
      action(x);
}

标准LINQ中没有类似的内容,但MoreLinq中有一个foreach运算符。