现有类似的Parallel.For LINQ扩展方法? [重复]
-
11-07-2019 - |
题
<强>可能重复:强>结果 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方法做到这一点。你可以换您的收藏列表中,然后使用该电话,但不是一个真正的好的事情。看起来你必须推出自己的。