如何在C#中使用linq查询对循环顺序排序?

如何在C#中使用linq查询对循环顺序排序?,c#,linq,C#,Linq,假设我有一个从1到3的项目列表 我可以按1,1,2,2,3,3的顺序订购 但是,我想在1,2,3,1,2,3之前订购 是否有一个已经存在的功能来实现这一点 这种方法将每个数字分成若干组,然后依次遍历这些组,同时有条件地将它们添加到结果列表中。也许有一些方法可以让它更安全、更高效,但这应该给你一个开始。(它假设,如果源数组中的每个数字的计数不相等,则在迭代阶段耗尽这些数字时,它将跳过这些数字。) int[]arr=new[]{1,1,1,2,2,3,3,4,4,5,5}; var orderLis

假设我有一个从1到3的项目列表

我可以按1,1,2,2,3,3的顺序订购

但是,我想在1,2,3,1,2,3之前订购


是否有一个已经存在的功能来实现这一点

这种方法将每个数字分成若干组,然后依次遍历这些组,同时有条件地将它们添加到结果列表中。也许有一些方法可以让它更安全、更高效,但这应该给你一个开始。(它假设,如果源数组中的每个数字的计数不相等,则在迭代阶段耗尽这些数字时,它将跳过这些数字。)

int[]arr=new[]{1,1,1,2,2,3,3,4,4,5,5};
var orderList=arr.OrderBy(x=>x.Distinct().ToArray();
var refList=arr.GroupBy(x=>x).ToDictionary(k=>k.Key,v=>v.Count());
var result=新列表();
int i=0;
while(result.Count0)
{
结果。添加(订单列表[i]);
refList[orderList[i]]--;
}
i++;
如果(i>=orderList.Length)
i=0;
}
//结果:[1,2,3,4,5,1,2,3,4,5,1,2,3,4,5]

这种方法将每个数字分成若干组,然后按顺序遍历这些组,同时有条件地将它们添加到结果列表中。也许有一些方法可以让它更安全、更高效,但这应该给你一个开始。(它假设,如果源数组中的每个数字的计数不相等,则在迭代阶段耗尽这些数字时,它将跳过这些数字。)

int[]arr=new[]{1,1,1,2,2,3,3,4,4,5,5};
var orderList=arr.OrderBy(x=>x.Distinct().ToArray();
var refList=arr.GroupBy(x=>x).ToDictionary(k=>k.Key,v=>v.Count());
var result=新列表();
int i=0;
while(result.Count0)
{
结果。添加(订单列表[i]);
refList[orderList[i]]--;
}
i++;
如果(i>=orderList.Length)
i=0;
}
//结果:[1,2,3,4,5,1,2,3,4,5,1,2,3,4,5]


不,没有。我甚至不能用一两个词来命名这种排序。您可以自己实现它。单独使用LINQ在技术上可能是可行的,但这会很麻烦。这将是更干净,更有效地实施它自己。没有意义。如果是
1,1,2,2,3,3,3,4
会是什么输出?开箱即用Linq提供了常见的实现,如顺序或降序。这个订单是什么?看起来是一个非常具体的问题case@CodingYoshi那么应该是1,2,3,4,1,2,3,3,3为什么?为什么不是1,2,3,1,2,3,1,2,3,4和其他可能性不,没有。我甚至不能用一两个词来命名这种排序。您可以自己实现它。单独使用LINQ在技术上可能是可行的,但这会很麻烦。这将是更干净,更有效地实施它自己。没有意义。如果是
1,1,2,2,3,3,3,4
会是什么输出?开箱即用Linq提供了常见的实现,如顺序或降序。这个订单是什么?看起来是一个非常具体的问题case@CodingYoshi那么应该是1,2,3,4,1,2,3,3,3为什么?为什么不是1,2,3,1,2,3,1,2,3,4和其他可能性呢?我一般都有这个想法。我将亲自尝试,因为1,2,3只是我拥有的一种对象类型。或者可能:
var result=Enumerable.Range(arr.Min(),arr.GroupBy(x=>x).First().Count()).SelectMany(y=>arr.OrderBy(x=>x).Distinct().ToList()@CodingYoshi,假设A]源列表中的数字保证按顺序排列,B]源列表中每个数字的计数保证相等。A]否。B]是。但它很容易改变。但是OP接受了你的答案,所以也许这就是他想要的:)我大体上明白了。我将亲自尝试,因为1,2,3只是我拥有的一种对象类型。或者可能:
var result=Enumerable.Range(arr.Min(),arr.GroupBy(x=>x).First().Count()).SelectMany(y=>arr.OrderBy(x=>x).Distinct().ToList()@CodingYoshi,假设A]源列表中的数字保证按顺序排列,B]源列表中每个数字的计数保证相等。A]否。B]是。但它很容易改变。但是OP接受了你的答案,所以也许这就是他想要的:)
int[] arr = new[] { 1,1,1,2,2,2,3,3,3,4,4,4,5,5,5 };

var orderList = arr.OrderBy(x => x).Distinct().ToArray();
var refList = arr.GroupBy(x => x).ToDictionary(k => k.Key, v => v.Count());

var result = new List<int>();
int i = 0;
while (result.Count < arr.Length)
{
    if (refList.Values.Sum() == 0)
        break;

    if (refList[orderList[i]] > 0)
    {
        result.Add(orderList[i]);
        refList[orderList[i]]--;
    }

    i++;
    if (i >= orderList.Length)
        i = 0;
}

// Result: [1,2,3,4,5,1,2,3,4,5,1,2,3,4,5]