当前位置:  开发笔记 > 编程语言 > 正文

现有的LINQ扩展方法类似于Parallel.For?

如何解决《现有的LINQ扩展方法类似于Parallel.For?》经验,为你挑选了2个好方法。

为了解释原因:

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

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

例如,以下代码在列表中的每个项目上调用函数委托,如果该项目为正,则返回true:

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

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

        Console.ReadKey();        
    }

请参阅http://stackoverflow.com/questions/858978/lambda-expression-using-foreach-clause和http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs上的确认-foreach.aspx (2认同)


Omer Mor.. 10

实际上,Microsoft Research的Reactive Extensions框架确实添加了此功能.在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

运行(动作)就像一个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



1> Neil..:

为了解释原因:

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

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

例如,以下代码在列表中的每个项目上调用函数委托,如果该项目为正,则返回true:

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

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

        Console.ReadKey();        
    }


很容易滚你自己.
请参阅http://stackoverflow.com/questions/858978/lambda-expression-using-foreach-clause和http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs上的确认-foreach.aspx

2> Omer Mor..:

实际上,Microsoft Research的Reactive Extensions框架确实添加了此功能.在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

运行(动作)就像一个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

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有