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()扩展方法是最佳选择:

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

这将允许您在问题中发布的确切代码正常工作。


没有任何内置的,但你可以很容易地创建自己的扩展方法来做到这一点:

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);
    }
}
链接地址: http://www.djcxy.com/p/52991.html

上一篇: Linq style "For Each"

下一篇: Find the last element of an array while using a foreach loop in PHP