gpt4 book ai didi

c# - GetPartitions 得到了偏斜的分区?

转载 作者:太空宇宙 更新时间:2023-11-03 12:13:48 25 4
gpt4 key购买 nike

在C#交互窗口中运行以下代码

using System.Collections.Concurrent;

var l = Enumerable.Range(0, 20);

Partitioner.Create(l).GetPartitions(4)
.Select(x => {
var s = "";
while (x.MoveNext()) { s += x.Current.ToString() + ","; };
return s;
})

返回

Enumerable.WhereSelectArrayIterator<IEnumerator<int>, string>
{ "0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,", "", "", "" }

似乎一个分区得到了所有的值?我尝试使用大尺寸 Enumerable.Range(0, 12000) 并且所有元素仍然位于第一个分区中。


我想确保以下扩展方法可以均匀地划分列表。

public static Task ForEachAsync<T>(this IEnumerable<T> source, int dop, Func<T, Task> body)
{
return Task.WhenAll(
from partition in Partitioner.Create(source).GetPartitions(dop)
select Task.Run(async delegate {
using (partition)
while (partition.MoveNext())
await body(partition.Current);
}));
}

最佳答案

我会说是你的代码导致了它:你只枚举了一个分区,但分区是根据要求“填充”的。

你想要一个简单的测试?

Partitioner.Create(l).GetPartitions(4)
.Skip(1)
.Select(x => {
var s = "";
while (x.MoveNext()) { s += x.Current.ToString() + ","; };
return s;
})

现在它是另一个分区获取所有值 :-) 但不是第一个分区获取所有值吗?现在是第二个:-)

更正确的测试是:

var l = Enumerable.Range(0, 20);

var parts = Partitioner.Create(l).GetPartitions(4);

string[] bufs = new string[parts.Count];

while (true)
{
int countFinished = 0;
for (int i = 0; i < parts.Count; i++)
{
if (parts[i].MoveNext())
{
bufs[i] += parts[i].Current + ",";
}
else
{
countFinished++;
}
}
if (countFinished == parts.Count)
{
break;
}
}

for (int i = 0; i < parts.Count; i++)
{
Console.WriteLine(bufs[i]);
}

我正在同时枚举四个分区。这将在分区之间平均分配所有数字。

关于c# - GetPartitions 得到了偏斜的分区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50726030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com