使用Parallel.For创建列表列表 - 我做错了什么?

时间:2013-08-15 08:47:08

标签: c# parallel-processing

我正在尝试在Parallel.For循环中填充列表列表,但是当循环完成时,列表列表为空。我做错了什么?

int[] nums = Enumerable.Range(0, 10).ToArray();
IList<IList<double>> bins = new List<IList<double>>();
Parallel.For<IList<IList<double>>>(0, nums.Length, () => new List<IList<double>>(), (i, loop, bin) =>
    {
        Random random = new Random();
        IList<double> list = new List<double>();
        for (int j = 0; j < 5; j++)
            list.Add(random.NextDouble() + i);
        bin.Add(list);
        return bin;
    }
    ,
    (bin) =>
    {
        lock (bins)
        {
            bins.Concat(bin);    
        }

    }
); 

2 个答案:

答案 0 :(得分:4)

这一行错了:

 bins.Concat(bin);  

这只是连接两个可枚举的序列并返回连接的结果(你扔掉了)。

我认为应该是:

foreach (var x in bin)
    bins.Add(x);

答案 1 :(得分:3)

您的部分问题是使用IList<...> bins代替List<...> bins。在此上下文中限制自己接口是没有好处的。

最小的改变是:

//IList<IList<double>> bins = new List<IList<double>>();
List<IList<double>> bins = new List<IList<double>>();

...

  lock (bins)
  {
     bins.AddRange(bin);    
  }

在旁注中,任务中的Random random = new Random();意味着您将拥有(至少一些)相同的子序列。