Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 与Parallel.For类似的现有LINQ扩展方法?_C#_Linq_Extension Methods_Iteration - Fatal编程技术网

C# 与Parallel.For类似的现有LINQ扩展方法?

C# 与Parallel.For类似的现有LINQ扩展方法?,c#,linq,extension-methods,iteration,C#,Linq,Extension Methods,Iteration,可能重复: ienumerable的linq扩展方法非常方便。。。但是,如果您只想对枚举中的每个项应用一些计算,而不返回任何内容,那么这并不是很有用。所以我想知道,也许我只是错过了正确的方法,或者它真的不存在,因为如果它可用,我宁愿使用内置版本。。。但我还没有找到一个:-) 我可以发誓在某个地方有一个.ForEach方法,但我还没有找到它。同时,我也写了自己的版本,以防对其他人有用: using System.Collections; using System.Collections.Gene

可能重复:

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);
        }
    }
}
使用系统集合;
使用System.Collections.Generic;
公共代表无效功能(T项);
公共委托无效函数(对象项);
公共静态类EnumerableExtensions
{
(此IEnumerable可枚举函数,函数func)的公共静态无效
{
foreach(可枚举中的对象项)
{
func(项目);
}
}
(此IEnumerable可枚举函数,函数func)的公共静态无效
{
foreach(可枚举中的T项)
{
func(项目);
}
}
}
用途是:


myEnumerable.For(委托(MyClass项){item.Count++;})

列表上的ForEach方法执行此操作。你可以将你的收藏打包成一个列表,然后使用这个调用,但这并不是一件好事。看来你得自己动手了。

已经讨论过了


我太昏昏欲睡,记不起来了,但基本上,单线程应用程序中的.ForEach方法在功能上等同于已经存在的ForEach语句。据我所知,主要区别在于ForEach可以被平行化,但这太容易导致不必要的行为。

进一步解释了原因:

LINQ本质上是功能性的。用于查询数据和返回结果。LINQ查询不应该改变应用程序的状态(除了缓存之类的例外)。因为foreach不返回任何结果,所以它没有很多用途,除了传递给它的内容之外,不涉及改变某些东西的状态。如果您需要一个Foreach()扩展方法,可以很容易地使用自己的方法

另一方面,如果您想要的是获取输入并对每个返回结果的项调用函数,那么LINQ通过其select方法提供了一种方法

例如,以下代码对列表中的每个项调用函数委托,如果该项为正,则返回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();        
    }
static void Main(字符串[]args)
{
IEnumerable list=新列表(){-5,3,-2,1,2,-7};
IEnumerable isPositiveList=list.Select(i=>i>0);
foreach(bool在isPositiveList中为正)
{
控制台写入线(isPositive);
}
Console.ReadKey();
}

实际上,微软研究院的反应式扩展框架添加了此功能。 在
System.Interactive
程序集中,它们包括
Run()
Do()
IEnumerable
的扩展

Do(action)将对每个元素执行操作并返回。这对于将日志添加到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
Run(action)类似于foreach循环,这意味着它折叠执行操作的序列

您可以在此处阅读更多信息:


Rx框架可以在这里找到:

不,除非我遗漏了什么,否则没有。ForEach方法我调整了我的答案,因为ForEach在列表中。cf Eric Lippert的答案:请参见确认,我认为这是不值得赞赏的。