C# GetPartitions有扭曲的分区吗?

C# GetPartitions有扭曲的分区吗?,c#,plinq,C#,Plinq,在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; })

在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,", "", "", "" }

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

你想要一个简单的测试吗

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]);
}
var l=可枚举范围(0,20);
var parts=Partitioner.Create(l).GetPartitions(4);
string[]bufs=新字符串[parts.Count];
while(true)
{
int countFinished=0;
对于(int i=0;i

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

源代码中有一条注释:例如,默认情况下,在IEnumerable实现快速且无阻塞的常见场景中,将采用某种形式的缓冲和分块来实现最佳性能。看,我已经更新了问题。我想确保扩展方法能将列表均匀地分区,好吗?@ca9163d9不知道。我不使用plinq,所以我什么都不知道。。。我给你的回答是基于一种感觉,它是扭曲的。我已经在ca9163d9上发布了另一个问题——我注意到了同样的事情,我想知道你是否设法“取消”了这个方法?我使用的扩展方法和你的相同
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]);
}