订单展平列表,无需更改组顺序

时间:2019-03-19 16:45:40

标签: linq sorting

我有一个未订购商品的收藏。每个项目都有2个属性:一个用于对它们进行分组,另一个用于对它们进行排序。我需要生成一个集合,其中项目在组内成为有序的,但是组的顺序不变。

例如,输入以下内容:

  

(12,0),(44,0),(22,1),(100,0),(1,0),(22,3),(22,2)

如何获取此输出(以下)?

  

(12,0),(44,0),(22,1),(22,2),(22,3),(100,0),(1,0)

22组中的通知项:它们一起移动到该组首先出现的位置,并且在它们之间进行排序。

这里是repro(使用C#7.0元组,别忘了在VS2017中定位4.7框架):

(int A, int B)[] input = new[] { (12, 0), (44, 0), (22, 1), (100, 0), (1, 0), (22, 3), (22, 2) };

var output = input.OrderBy(o => o.A).ThenBy(o => o.B).ToArray();
//var output = input.Select((o, i) => new { Index = i, Item = o }).GroupBy(o => o.Item.A)...SelectMany().ToArray();

Console.WriteLine(string.Join(", ", output.Select(o => $"({o.A}, {o.B})")));

未注释部分也会对组进行排序,从而产生错误的输出。然后我偶然发现(注释部分)索引,分组,展平..这不是那么难还是应该吗?

1 个答案:

答案 0 :(得分:1)

您对问题的描述也是对答案的描述-分组,然后对每个分组进行排序。 GroupBy的定义指定组将以输入的原始顺序出现在输出中:

var output = input.GroupBy(s => s.A).SelectMany(sg => sg.OrderBy(s => s.B)).ToArray();