假设我有1 - 3的项目列表。
我可以按1,1,2,2,3,3订购它们。
但相反,我想通过1,2,3,1,2,3 ....
订购它们是否存在已实现的功能?
答案 0 :(得分:2)
此方法将每个数字分成组,然后按顺序遍历组,同时有条件地将它们添加到结果列表中。可能有办法使这更安全,更有效,但这应该给你一个开始。 (它假设如果源数组中每个数字的计数不相等,它将跳过这些数字,因为它在迭代阶段用完它们。)
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]