如何使用 C# 打破 List<T>.AsParallel().ForAll()

Sri*_*m B 5 plinq c#-4.0

我正在使用 List.AsParallel().ForAll() PLINQ 实现。在循环内部,如果我发现某个条件成功,我希望循环立即脱离 ForAll() 循环。我怎样才能实现它?

这是示例代码。

using System;
using System.Collections.Generic;
using System.Linq;

namespace Basics
{
class Program
{
    class Family
    {
        public int SNo { get; set; }
        public string Name { get; set; }
    }

    static List<Family> families = null;
    static Program()
    {
        families = new List<Family>()
        {
            new Family(){SNo = 10, Name="Richard"},
            new Family(){SNo = 33, Name="Xio Fung"},
            new Family(){SNo = 10, Name="Sean"},
            new Family(){SNo = 10, Name="Andrea"},
            new Family(){SNo = 20, Name="Bjorn"},
            new Family(){SNo = 20, Name="Isabella"},
            new Family(){SNo = 35, Name="Michael"},
            new Family(){SNo = 35, Name="Marie"}
        };
    }

    private static void Main()
    {
        Dictionary<int, List<Family>> theFamily = new Dictionary<int, List<Family>>();
        var groupedFamilies = families.GroupBy(family => family.SNo);

        groupedFamilies.AsParallel().ForAll(groupedFamily =>
        {
            int groupedFamilyCount = groupedFamily.Count();
            if (groupedFamilyCount == 1)
            {
                Console.WriteLine(groupedFamily.FirstOrDefault().Name);     
                // break; <-- I want to break if I find the count = 1
            }
        });                                 
        Console.ReadLine();
    }
}    
Run Code Online (Sandbox Code Playgroud)

}

问候, 斯里拉姆

neo*_*pir 4

我相信Parallel.ForEach会起作用:

Parallel.ForEach(groupedFamilies.AsParallel(), (groupedFamily, loopState) =>
            {
                int groupedFamilyCount = groupedFamily.Count();
                if (groupedFamilyCount == 1)
                {
                    Console.WriteLine(groupedFamily.FirstOrDefault().Name);
                    loopState.Stop(); // break if I find the count = 1

                }
            });
Run Code Online (Sandbox Code Playgroud)

根据您的用例,您可能需要loopState.Break改为。用于Stop()类似 Any 的操作,Break()用于类似 First 的操作。

Microsoft 关于.NET 4 并行编程的文章中有一篇关于该主题的好文章,名为“何时使用 Parallel For Each Or PLINQ?”