Заказать плоский список без изменения группового заказа - PullRequest
0 голосов
/ 19 марта 2019

У меня есть коллекция, где предметы не заказаны. Каждый элемент имеет 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: они перемещены вместе туда, где группа появляется первой, и упорядочены между собой.

Вот репродукция (с использованием кортежей C # 7.0, не забудьте нацелиться на 4.7 framework в VS2017):

(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 Ответ

1 голос
/ 20 марта 2019

Ваше описание проблемы также является описанием группы ответа, а затем сортирует каждую группу.Определение GroupBy указывает, что группы будут появляться в выходных данных в исходном порядке из входных данных:

var output = input.GroupBy(s => s.A).SelectMany(sg => sg.OrderBy(s => s.B)).ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...