用Parallel创建列表.我做错了什么

本文关键字:错了 什么 列表 Parallel 创建 | 更新日期: 2023-09-27 18:27:41

我试图在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);    
        }
    }
); 

用Parallel创建列表.我做错了什么

此行错误:

 bins.Concat(bin);  

这只是将两个可枚举序列连接起来,并返回连接的结果(您将丢弃)。

我认为应该是:

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

部分问题在于使用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();意味着您将拥有(至少一些)相同的子序列。