C# 如何为ParallelQuery编写一个映射方法而不违背其目的?

C# 如何为ParallelQuery编写一个映射方法而不违背其目的?,c#,multithreading,linq,extension-methods,parallel-processing,C#,Multithreading,Linq,Extension Methods,Parallel Processing,我想在不破坏并行性的情况下为ParallelQuery编写一个映射扩展方法。问题是,我不知道怎么做。我之所以使用ParallelQuery,是因为我相信多线程将提高我的性能,以下是我迄今为止的代码: public static List<T2> Map<T, T2>(this ParallelQuery<T> source, Func<T, T2> func) { List<T2> result = new List<T2

我想在不破坏并行性的情况下为ParallelQuery编写一个映射扩展方法。问题是,我不知道怎么做。我之所以使用ParallelQuery,是因为我相信多线程将提高我的性能,以下是我迄今为止的代码:

public static List<T2> Map<T, T2>(this ParallelQuery<T> source, Func<T, T2> func)
{
    List<T2> result = new List<T2>();
    foreach(T item in source)
    {
        result.Add(func(item));
    }
    return result;
}
公共静态列表映射(此ParallelQuery源代码,Func Func)
{
列表结果=新列表();
foreach(源中的T项)
{
结果。添加(功能(项目));
}
返回结果;
}
正如你所看到的,如果我是正确的,这种方法会破坏并行性的目的。如何正确地执行此操作


感谢Dykam指出了
Select
-方法正是我想要的行为。不过,出于学习目的,我想看看这到底是怎么回事,谢谢

你的问题激怒了我的开发者,所以我再次提起这个问题,提出了这个问题:

public static IEnumerable<T2> Map<T,T2>(this ParallelQuery<T> source, Func<T,T2> func)
{
    var list = new ConcurrentBag<T2>();
    source.ForAll(s => list.Add(func(s)));
    return list.ToList();
}
公共静态IEnumerable映射(此ParallelQuery源代码,Func Func)
{
var list=新的ConcurrentBag();
source.ForAll(s=>list.Add(func));
return list.ToList();
}
ForAll
并行循环通过
source
查询,并将结果添加到线程安全的集合中


当我需要一些个人扭曲的类似选择的行为时,我会记住这一点。当函数
func
是一个相对繁重的过程时,这可能是一个有效的方法。

-我链接的是一个实际的映射方法,您编写了两个映射并将其聚合到一个列表中。确实不是平行的。我不知道它是否能帮助解决您的问题,但您可能应该使用
收益率返回
,而不是在扩展方法中构建列表。@Dykam+1我开始纳闷为什么OP会费心编写自己的
Select()
。然后我打开了你的链接……是的,对了,@Dykam,你会用Select方法回答我的问题。然而,仅就jist而言,我想看看如何构建一个用于学习目的的扩展方法,我们对此有什么建议吗?我还更新了我的答案以反映这一点。@DennisRöttger,这是Mono的实现:指