如何在不破坏其目的的情况下为ParallelQuery编写Map-Method?

Den*_*ger 5 c# linq parallel-processing extension-methods multithreading

我想在不破坏并行性的情况下为ParallelQuery编写Map-Extension方法.问题是,我不知道如何.我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,如果我是正确的,这种方式会破坏并行性的目的.我该如何正确地做到这一点?

感谢Dykam指出-Method Select正是我想要的行为.但是,仅仅为了学习目的,我想看看它是如何工作的,谢谢!

Ger*_*old 2

你的问题激起了我开发者的心,所以我再次拿起它并想出了这个:

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();
}
Run Code Online (Sandbox Code Playgroud)

ForAll并行循环查询source并将结果添加到线程安全集合中。

当我需要类似 Select 的行为并带有一些个人特色时,我会牢记这一点。当功能是一个相对繁重的过程时,这可能是一种有效的方法func