我正在尝试在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);
}
}
);
答案 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();
意味着您将拥有(至少一些)相同的子序列。