2016-10-19 2 views
1

Я пытаюсь использовать IComprarer для сложной сортировки. У меня есть этот сложный тип (для простоты, три INTS):Использование IComparer для группировки и сортировки

ID | A | B 
1 | 1 | 10 
2 | 3 | 20 
3 | 1 | 30 
4 | 3 | 5 
5 | 2 | 15 

А мне нужно сортировать по B, но мне нужно держать вместе. B может быть ASC или DESC, но я не могу отделить «A»

Он должен заказать этот путь:

ID | A | B 
3 | 1 | 30 
1 | 1 | 10 
2 | 3 | 20 
4 | 3 | 5 
5 | 2 | 15 

Там нет ничего особенного в заказе, важные вещи являются: B заказывается и тот же А не должен быть отделен.

Я пробовал:

public int Compare(Comanda x, Comanda y) 
{ 
    if (x.A == y.A) return 0; 
    return x.B.CompareTo(y.B); 
} 

Но не работает, и я даже не знаю, как спросить его Google, «группа» ключевое слово не поможет.

А также попытался сортировать дважды, что, очевидно, не работает (отменил заказ B).

list.Sort(new SortByB()); 
list.Sort(new SortByA()); 

Как это сделать? Thanks

Это не дубликат «Список C# <> Сортировка по x, а затем y», потому что я не хочу делать двойную сортировку. Я хотел ГРУППУ

+0

Похоже, что вы хотите группе А, то порядок на макс B в каждой группе, а также заказать элементы в группах по В. Это не может быть сделано с помощью 'IComparer'. – juharr

+0

Возможный дубликат [C# List <> Сортировать по x, затем y] (http://stackoverflow.com/questions/289010/c-sharp-list-sort-by-x-then-y) – Sebi

+0

@Sebi это не , Мне не нужна двойная сортировка, мне нужна GROUP, а затем сортировка – Rafael

ответ

4

Для конкретного примера я хотел бы сделать следующее.

var sorted = list.GroupBy(x => x.A) 
      .OrderByDescending(g => g.Max(x => x.B)) 
      .SelectMany(g => g.OrderByDescending(x => x.B)); 

Вы в основном должны группу на первом затем Упорядочение групп на максимальное значение В, то заказать элементы в каждой группе по В.

Другим вариантом было бы первого порядка на В, затем группу на A, затем упорядочьте группы по значению B в первом элементе в группе (который должен быть максимальным B для группы, так как мы уже заказывали на них), а затем просто сглаживаем результаты.

var sorted = list.OrderByDescending(x => x.B) 
      .GroupBy(x => x.A) 
      .OrderByDescending(g => g.First().B) 
      .SelectMany(g => g); 
+0

Сохранено в день! Спасибо огромное ! (я не знал GroupBy и SelectMany, я прочитаю об этом больше) – Rafael

0

Вы можете использовать OrderBy я догадываюсь:

var sorted = list.orderby(comanda=>commanda.B).thenby(comanda=>commanda.A); 
+0

Не работайте. Те же результаты, что и сортировка дважды – Rafael