Parallel.Foreach 在两个 foreach 循环中

查特拉

我有按一列分组的对象列表,如下所示。

我有数百万条记录,耗时超过 30 分钟。如何有效地编写以下代码?

List<Voter> voterList = new List<Voter>();

IEnumerable<IGrouping<string, MemberInfo>> groupByLastName = infoList.GroupBy(info => info.LastName).Select(i => i);

foreach (List<MemberInfo> lastName in groupByLastName)
{
    foreach (MemberInfo member in lastName)
    {
        MemberInfo info = memberService.GetMemberDetails(member.FirstName);

        if (info.Age > 18)
        {
            voterList.Add(new Voter{
                VoterId = member.VoterId,
                Age = member.Age
            });
        }
    }
}
手榴弹编码器
  1. 使用 Parallel.ForEach

  2. 将您的结果对象添加到线程安全集合。

下面是一些伪代码。我无法确定您可以使用哪些对象,因为您的原始帖子多次使用“var”。

 BlockingCollection<Voter> bc = new BlockingCollection<Voter>();


 Parallel.ForEach(myCollection, (e) => { 

     bc.Add(e);

 });

所以我会首先收集你所有的 inputValues(到你的 wcf)

ICollection allTheInputLastNames = new List();

IEnumerable<IGrouping<string, MemberInfo>> groupByLastName = infoList.GroupBy(info => info.LastName).Select(i => i);

foreach (List<MemberInfo> lastName in groupByLastName)
{
    foreach (MemberInfo member in lastName)
    {
       allTheInputLastNames.add(member.FirstName);
    }      
}

现在,因为你有这么多,希望这运行得相当快。

现在您已经收集了所有输入,您想要使用 Parallel.ForEach。

我在下面创建了一个通用示例。

在我有 inputValues 的地方,你会有你的 allTheInputLastNames。

在我创建新的 ResultObject 的地方,您将进行 wcf-service 调用。

在我做一个“StringLength % 2”的地方,你会检查你的 info.Age 。

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace MyApp.ParallelStuff
{
    public class ParallelExampleOne
    {

        public void ExampleOne()
        {

            ICollection<string> inputValues = new List<string>();

            for (int i = 1; i < 10000; i++)
            {
                inputValues.Add("MyValue" + Convert.ToString(i));
            }

            CancellationTokenSource ct = new CancellationTokenSource();

            BlockingCollection<ResultObject> finalItems = new BlockingCollection<ResultObject>();

            Parallel.ForEach(inputValues, (currentInputItem) =>
            {
                ResultObject ro = new ResultObject(currentInputItem.Length, currentInputItem);

                if (ro.StringLength % 2 == 0)
                {
                    finalItems.Add(ro);
                }

            });

            Console.WriteLine("ExampleOne.finalItems.Count={0}", finalItems.Count);
            string temp = string.Empty;
        }

        public void ExampleTwo()
        {

            ICollection<string> inputValues = new List<string>();
            for (int i = 1; i < 10000; i++)
            {
                inputValues.Add("MyValue" + Convert.ToString(i));
            }

            CancellationTokenSource ct = new CancellationTokenSource();

            BlockingCollection<ResultObject> finalItems = new BlockingCollection<ResultObject>();

            ParallelOptions options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount, CancellationToken = ct.Token };

            ParallelLoopResult results = Parallel.ForEach(inputValues, options, currentInputValue =>
            {
                ResultObject ro = new ResultObject(currentInputValue.Length, currentInputValue);

                if (ro.StringLength % 2 == 0)
                {
                    finalItems.Add(ro);
                }

            });

            Console.WriteLine("ExampleTwo.finalItems.Count={0}", finalItems.Count);

            string temp = string.Empty;
        }



    internal class ResultObject
    {
        internal int StringLength { get; private set; }
        internal string OutputValue { get; private set; }

        public ResultObject(int stringLength, string inputValue)
        {
            this.StringLength = stringLength;
            this.OutputValue = inputValue + "MyOutputSuffix";
        }
    }

}

还要注意如何阅读我的代码,因为我没有在变量声明中使用“var”。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在foreach循环中使用Parallel :: ForkManager

来自分类Dev

在两个foreach循环中合并xml结果

来自分类Dev

在Perl foreach循环中分配两个变量

来自分类Dev

在两个foreach循环中合并xml结果

来自分类Dev

视图中的两个foreach循环

来自分类Dev

如何从Parallel.ForEach循环中引发异常?

来自分类Dev

从事件的无限Parallel.Foreach循环中取消令牌

来自分类Dev

在Parallel.ForEach循环中更改引用的数据表

来自分类Dev

使用Parallel.ForEach启动两个并行任务

来自分类Dev

Powershell-从两个变量的ForEach循环中调用唯一值以执行PowerCLI命令

来自分类Dev

无法在两个PHP foreach循环中设置数组值

来自分类Dev

如何在一个foreach循环中检查两个数组?

来自分类Dev

如何在foreach循环中执行两个不同的php准备好的语句?

来自分类Dev

laravel刀片的foreach循环中两个不同的“ get”集合的条件

来自分类Dev

无法从Codeigniter中的foreach循环中的两个表中获取记录

来自分类Dev

如何在foreach循环中执行两个不同的php准备好的语句?

来自分类Dev

forEach循环中的setTimeout

来自分类Dev

foreach循环中的条件

来自分类Dev

在foreach()循环中中断if

来自分类Dev

在foreach循环中的mail()

来自分类Dev

foreach循环中的数组

来自分类Dev

在foreach循环中使用parallel.foreach和task之间的性能差异是什么?

来自分类Dev

在 Parallel.ForEach 循环中,我想增加一个 var 但 Interlock.Increment 似乎不起作用

来自分类Dev

正确使用foreach循环中的foreach循环

来自分类Dev

正确使用foreach循环中的foreach循环

来自分类Dev

while循环中的foreach循环

来自分类Dev

Parallel.ForEach的第一个循环

来自分类Dev

在另一个foreach json循环中循环一个foreach json循环

来自分类Dev

如何使用foreach循环到另一个foreach循环中遍历codeigniter中的两个不同的数据表?

Related 相关文章

  1. 1

    在foreach循环中使用Parallel :: ForkManager

  2. 2

    在两个foreach循环中合并xml结果

  3. 3

    在Perl foreach循环中分配两个变量

  4. 4

    在两个foreach循环中合并xml结果

  5. 5

    视图中的两个foreach循环

  6. 6

    如何从Parallel.ForEach循环中引发异常?

  7. 7

    从事件的无限Parallel.Foreach循环中取消令牌

  8. 8

    在Parallel.ForEach循环中更改引用的数据表

  9. 9

    使用Parallel.ForEach启动两个并行任务

  10. 10

    Powershell-从两个变量的ForEach循环中调用唯一值以执行PowerCLI命令

  11. 11

    无法在两个PHP foreach循环中设置数组值

  12. 12

    如何在一个foreach循环中检查两个数组?

  13. 13

    如何在foreach循环中执行两个不同的php准备好的语句?

  14. 14

    laravel刀片的foreach循环中两个不同的“ get”集合的条件

  15. 15

    无法从Codeigniter中的foreach循环中的两个表中获取记录

  16. 16

    如何在foreach循环中执行两个不同的php准备好的语句?

  17. 17

    forEach循环中的setTimeout

  18. 18

    foreach循环中的条件

  19. 19

    在foreach()循环中中断if

  20. 20

    在foreach循环中的mail()

  21. 21

    foreach循环中的数组

  22. 22

    在foreach循环中使用parallel.foreach和task之间的性能差异是什么?

  23. 23

    在 Parallel.ForEach 循环中,我想增加一个 var 但 Interlock.Increment 似乎不起作用

  24. 24

    正确使用foreach循环中的foreach循环

  25. 25

    正确使用foreach循环中的foreach循环

  26. 26

    while循环中的foreach循环

  27. 27

    Parallel.ForEach的第一个循环

  28. 28

    在另一个foreach json循环中循环一个foreach json循环

  29. 29

    如何使用foreach循环到另一个foreach循环中遍历codeigniter中的两个不同的数据表?

热门标签

归档