“LINQ订购人”;循环制;

“LINQ订购人”;循环制;,linq,round-robin,Linq,Round Robin,看起来这应该是一项简单的任务,但我不知道如何与LINQ一起完成。到目前为止,我能找到的唯一信息是关于循环赛的形式,这不是我想要的。我可能找错了。鉴于以下清单: var items [] { "apple", "banana", "banana", "candy", "banana", "fruit", "apple" }; 如何对其进行排序(最好使用linq),使其以“循环”的顺序出现,也就是说,在重复之前选择每个唯一的项一次。所以上面的列表是这样的(如果它是按字母顺序排列的,这并不重要,即使

看起来这应该是一项简单的任务,但我不知道如何与LINQ一起完成。到目前为止,我能找到的唯一信息是关于循环赛的形式,这不是我想要的。我可能找错了。鉴于以下清单:

var items [] { "apple", "banana", "banana", "candy", "banana", "fruit", "apple" };
如何对其进行排序(最好使用linq),使其以“循环”的顺序出现,也就是说,在重复之前选择每个唯一的项一次。所以上面的列表是这样的(如果它是按字母顺序排列的,这并不重要,即使这个列表是这样的):


我知道我可以通过反复努力来做到这一点,我只是希望有更简单的事情。有人知道怎么做吗?提前谢谢

我做过一次,找到了代码:

var sorted = items.GroupBy(s => s)
    .SelectMany(grp => grp.Select((str, idx) => new { Index = idx, Value = str }))
    .OrderBy(v => v.Index).ThenBy(v => v.Value)
    .Select(v => v.Value)
    .ToArray();
//Originially written for lists, all you need is prepend a .ToList() where needed to apply this to an array
List<string> src = new List<string> { "string1", "string2" }; //source
List<string> dst = new List<string>();

dst.AddRange(src.Distinct());
dst.ForEach(d => src.RemoveAt(src.FindIndex(i => i.Equals(d)))); //remove the first occurrence of each distinct element
dst.AddRange(src);
//最初是为列表编写的,您只需在需要将其应用于数组的地方预先添加一个.ToList()
List src=新列表{“string1”、“string2”}//来源
List dst=新列表();
AddRange(src.Distinct());
dst.ForEach(d=>src.RemoveAt(src.FindIndex(i=>i.Equals(d))//删除每个不同元素的第一个匹配项
dst.AddRange(src);

在我写这篇文章时,我看到两个答案突然出现;哦,好吧,这是另一种方式:

var items [] { "apple", "banana", "banana", "candy", "banana", "fruit", "apple" };

var uniqueItems = items.Distinct().OrderBy(item => item); // alphabetical orderBy is optional

var duplicateItems = items
                     .GroupBy(item => item)
                     .SelectMany(group => group.Skip(1))
                     .OrderBy(item => item); // alphabetical orderBy is optional;

var sorted = uniqueItems.Append( duplicateItems ).ToArray();

你能准确地解释一下“循环”排序是什么意思吗?他的意思是“循环”排序应该学会正确地复制粘贴。接受这个,这个有效,你真是太棒了。它工作得很好。非常感谢。我所需要更改的只是我的项目的GroupBy,以便根据我关心的实际唯一项目进行分组,其余的就是复制粘贴。再次感谢!
var items [] { "apple", "banana", "banana", "candy", "banana", "fruit", "apple" };

var uniqueItems = items.Distinct().OrderBy(item => item); // alphabetical orderBy is optional

var duplicateItems = items
                     .GroupBy(item => item)
                     .SelectMany(group => group.Skip(1))
                     .OrderBy(item => item); // alphabetical orderBy is optional;

var sorted = uniqueItems.Append( duplicateItems ).ToArray();