2010-06-15 3 views
58

У меня есть список, который мне нужно отсортировать по двум полям. Я попытался использовать OrderBy в LINQ, но это только позволяет мне указать одно поле. Я ищу список, который нужно отсортировать по первому полю, а затем, если в первом поле есть какие-то дубликаты для сортировки по второму полю.LINQ OrderBy с более чем одним полем

Например, я хочу, чтобы результаты выглядели так (отсортированные по фамилии, а затем по имени).

  • Адамс, Джон
  • Смит, Джеймс
  • Смит, Питер
  • Томпсон, Фред

Я видел, что вы можете использовать SQL like syntax to accomplish this, но я искал способ сделать это с помощью метода OrderBy.

IList<Person> listOfPeople = /*The list is filled somehow.*/ 
IEnumerable<Person> sortedListOfPeople = listOfPeople.OrderBy(aPerson => aPerson.LastName, aPerson.FirstName); //This doesn't work. 

ответ

120

Вы должны использовать ThenBy:

listOfPeople.OrderBy(person => person.LastName) 
      .ThenBy(person => person.FirstName) 
+1

Полное объяснение перечислен здесь: Http: // Веблоги. asp.net/zeeshanhirani/archive/2008/04/16/thenby-operator-part-14.aspx – DigitalNomad

+0

Это Лямбда .. Для решения LINQ необходимо @svick использовать его в LINQ. –

+2

Я не уверен, что вы имеете в виду. Синтаксис запроса - это просто сахар для синтаксиса метода выше; оба являются «LINQ». См. Http://msdn.microsoft.com/en-us/library/vstudio/bb397947.aspx И если вы прочитали вопрос, он специально попросил версию синтаксиса метода. – tzaman

1
var sortedListOfPeople = listOfPeople.OrderBy(aPerson => aPerson.LastName).ThenBy(a => aPerson.FirstName); 
2

Ваши последующие поля должны быть упорядочены с помощью метода

19

ThenBy() Если вы хотите используйте метод синтаксиса, используйте ThenBy(), так как другие предлагают изд:

listOfPeople.OrderBy(person => person.LastName) 
      .ThenBy(person => person.FirstName) 

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

from person in listOfPeople 
orderby person.LastName, person.FirstName 
select person 

Приведенный выше код будет фактически компилируется в код, использует OrderBy() и ThenBy(), как в первом примере.

Кроме того, если вы хотите иметь OrderBy(), которая принимает два (или более) ключей сортировки, можно, конечно, написать, что в качестве метода расширения на IEnumerable<T>, который внутренне вызывает OrderBy() и ThenBy().

0

Путь заказать список с более поданной является продолжением:

var soterdList = initialList.OrderBy(x => x.Priority). 
            ThenBy(x => x.ArrivalDate). 
            ThenBy(x => x.ShipDate); 

Вы можете добавить другие поля с clasole «ThenBy»

Смежные вопросы