现有的LINQ扩展方法类似于Parallel.For?
可能重复:
IEnumerable <T>的foreach相当于LINQ
可枚举的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将通过它的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();
}
实际上,Microsoft Research的Reactive Extensions框架确实增加了这个功能。 在System.Interactive
程序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
Run(action)就像一个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方法执行此操作。 你可以将你的集合包装在一个列表中,然后使用这个调用,但这不是一件好事。 看起来你必须推出自己的。
上一篇: Existing LINQ extension method similar to Parallel.For?