Как отсортировать часть элементов в общем списке - PullRequest
1 голос
/ 27 июня 2011

У меня есть объект List, который содержит элементы следующего типа

public class Item{

    public int Type; //this can be only 0 or 1
    public string Text;


}

Я хотел бы сначала отсортировать весь список по типу, а затем выполнить другую сортировку по тексту только для элементов с типом 1?

Как этого добиться?

Большое спасибо

Мин

Ответы [ 6 ]

10 голосов
/ 27 июня 2011

Вот как бы я это сделал.

var ordered = list.OrderBy(i => i.Type == 0 ? "" : i.Text);

Предполагается, что нет пустых текстовых строк, где i == 0. Если вы не можете сделать это предположение, сработает следующее:

var ordered = list.OrderBy(i => i.Type).ThenBy(i => i.Type == 0 ? "" : i.Text);

Задав одинаковые значения всем элементам с типом 0, вы оставите их все в их первоначальном порядке, а другие элементы будут отсортированы по текстовому значению.

На заметке, это запах кода:

public int Type; //this can be only 0 or 1

На первый взгляд это звучит так, как будто это должен быть логический или пользовательский тип enum. После более глубокого взгляда на то, что вы пытаетесь сделать, кажется, что вы, возможно, не ожидаете, что Text будет даже допустимым значением, если Type равен 0. Если это так, вам следует рассмотреть возможность использования наследования классов для фактического отличить один тип предмета от другого.

2 голосов
/ 27 июня 2011

Ваш вопрос не совсем понятен. Звучит так, как будто вы хотите ДВА разных сортировки, а не сортировку по одному полю, а затем стабильную повторную сортировку, когда Type равно 1?

Предполагая первое:

var sortByType = items.OrderBy(x => x.Type)
                      .ToList();
var sortTheOnesByText = items.Where(x => x.Type == 1)
                             .OrderBy(x => x.Text)
                             .ToList();
1 голос
/ 27 июня 2011

Реализация IComparable<Item> Подробности см. В примере msdn И чем просто использовать List<T>.Sort() метод

1 голос
/ 27 июня 2011
List<Item> items;

items = items.OrderBy(i => i.Type).ThenBy(i => i.Type == 1 ? i.Text : null);
0 голосов
/ 27 июня 2011

Я думаю, вы имеете в виду, что вы хотите поместить все type = 0 спереди и все type = 1 сзади, а также сортировать по тексту, где type = 1.

items.OrderBy(item => item.Type).ThenBy (item => type == 0 ? "" : item.Text)
0 голосов
/ 27 июня 2011

Если вы не возражаете и при заказе предметов типа 0, тогда вы можете сделать

var sortedItems = items.OrderBy(i => i.Type).ThenBy(i => i.Text);

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

var sortedItems = items.OrderBy(i => i.Type).ThenBy(i => i.Type == 0 ? "A" : i.Text);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...