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

时间:2017-01-23 03:51:31

标签: c# linq

假设我有1 - 3的项目列表。

我可以按1,1,2,2,3,3订购它们。

但相反,我想通过1,2,3,1,2,3 ....

订购它们

是否存在已实现的功能?

1 个答案:

答案 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]