用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);
}
}
);
此行错误:
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();
意味着您将拥有(至少一些)相同的子序列。