<强>可能重复:结果    LINQ等效的foreach为IEnumerable的

有关IEnumerable的LINQ的扩展方法是非常方便......但没有多大用处的,如果你想要做的是应用一些计算来枚举每个项目不返回任何东西。所以我在想,如果可能,我只是缺少正确的方法,或者如果它确实不存在,因为我宁愿使用一个内置的版本,如果它是可用的......但我还没有找到一个: - )

我可以发誓有一个.ForEach方法的地方,但我还没有找到它。在此期间,我写的情况下,我自己的版本是为别人有用的:

using System.Collections;
using System.Collections.Generic;

public delegate void Function<T>(T item);
public delegate void Function(object item);

public static class EnumerableExtensions
{
    public static void For(this IEnumerable enumerable, Function func)
    {
        foreach (object item in enumerable)
        {
            func(item);
        }
    }

    public static void For<T>(this IEnumerable<T> enumerable, Function<T> func)
    {
        foreach (T item in enumerable)
        {
            func(item);
        }
    }
}

用法是:

myEnumerable.For<MyClass>(delegate(MyClass item) { item.Count++; });

有帮助吗?

解决方案

上脱落多一点光为什么:

LINQ在本质上是功能性的。它是用来查询数据并返回结果。 LINQ查询不应该改变应用程序(具有像缓存一些例外)的状态。因为的foreach不返回任何结果,它不会有很多用途,不涉及改变的东西,除了国家要传递什么吧。如果你需要一个Foreach()扩展方法,它容易推出自己的。

如果,在另一方面,你要的是把输入并调用返回结果的每一项功能,LINQ提供通过其选择方法的一种方式。

例如,下面的代码调用列表中的每个项目的功能委托,返回true,如果该项目是正的:

    static void Main(string[] args)
    {
        IEnumerable<int> list = new List<int>() { -5, 3, -2, 1, 2, -7 };
        IEnumerable<bool> isPositiveList = list.Select<int, bool>(i => i > 0);

        foreach (bool isPositive in isPositiveList)
        {
            Console.WriteLine(isPositive);
        }

        Console.ReadKey();        
    }

其他提示

其实,从微软研究院的反应扩展框架确实添加了这个功能。 在System.Interactive组件他们已经包含了Run()Do()扩展IEnumerable<T>

<强> DO(动作)将执行的每个元件上的作用,并产生了回去。这是添加记录到LINQ查询例如有用:

var res = GetRandomNumbers(100).Take(10)
      .Do(x => Console.WriteLine("Source  -> {0}", x))
      .Where(x => x % 2 == 0)
      .Do(x => Console.WriteLine("Where   -> {0}", x))
      .OrderBy(x => x)
      .Do(x => Console.WriteLine("OrderBy -> {0}", x))
      .Select(x => x + 1)
      .Do(x => Console.WriteLine("Select  -> {0}", x));

这将导致:

Source  -> 96 
Where   -> 96 
Source  -> 25 
Source  -> 8 
Where   -> 8 
Source  -> 79 
Source  -> 25 
Source  -> 3 
Source  -> 36 
Where   -> 36 
Source  -> 51 
Source  -> 53 
Source  -> 81 
OrderBy -> 8 
Select  -> 9 
9 
OrderBy -> 36 
Select  -> 37 
37 
OrderBy -> 96 
Select  -> 97 
97

生成(动作)像foreach循环,这意味着它的折叠,其执行动作的顺序。

您可以阅读更多关于它在这里:的 http://community.bartdesmet.net/blogs/bart/archive/2009/12/26/more-linq-with-system-interactive-the-ultimate-imperative。 ASPX

在RX框架可以在这里找到: http://msdn.microsoft。 COM / EN-US / devlabs / ee794896.aspx

List<T>在foreach方法做到这一点。你可以换您的收藏列表中,然后使用该电话,但不是一个真正的好的事情。看起来你必须推出自己的。

已经讨论 的。

林太昏昏欲睡记住,但,基本上,在单一线程应用.ForEach方法是功能上等同的已经存在的foreach语句。据我了解,主要的区别在于,一个foreach可以parallized但这样会很容易引入不必要的行为。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top