1

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

    }
); 
4

2 回答 2

4

这一行是错误的:

 bins.Concat(bin);  

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

我认为应该是:

foreach (var x in bin)
    bins.Add(x);
于 2013-08-15T08:52:45.030 回答
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();在任务内部意味着您将拥有(至少一些)相同的子序列。

于 2013-08-15T09:02:47.720 回答