Birden fazla alanla LINQ OrderBy


83

İki alana göre sıralanmış ihtiyacım olan bir listem var. LINQ'da OrderBy'yi kullanmayı denedim, ancak bu yalnızca bir alan belirlememe izin veriyor. Listenin ilk alana göre sıralanmasını ve ardından birinci alanda ikinci alana göre sıralamak için yinelenen öğeler olup olmadığını arıyorum.

Örneğin, sonuçların böyle görünmesini istiyorum (soyadına ve ardından ada göre sıralanır).

  • Adams, John
  • Smith, James
  • Smith, Peter
  • Thompson, Fred

Bunu gerçekleştirmek için SQL benzeri sözdizimini kullanabileceğinizi gördüm, ancak bunu OrderBy yöntemiyle yapmanın bir yolunu arıyorum.

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

Yanıtlar:


171

Kullanmanız gerekenler ThenBy:

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

1
Tam bir açıklama burada listelenmiştir: weblogs.asp.net/zeeshanhirani/archive/2008/04/16/…
DigitalNomad

Bu Lambda .. LINQ çözüm ihtiyacı @svick, LINQ'da var.
Ravi Ram

5
Ne anlatmak istediğinden emin değilim. Sorgu sözdizimi, yukarıdaki yöntem sözdizimi için şekerdir; her ikisi de "LINQ". Bkz. Msdn.microsoft.com/en-us/library/vstudio/bb397947.aspx Ve soruyu okursanız, özellikle yöntem sözdizimi sürümünü soruyor.
tzaman

25

Yöntem sözdizimini kullanmak istiyorsanız ThenBy(), diğerlerinin önerdiği gibi kullanın :

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

Sorgu sözdiziminde, aynısı hemen hemen istediğiniz şekilde gerçekleştirilebilir: virgülle ayrılmış iki sıralama anahtarı:

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

Yukarıdaki kod , ilk örnekte olduğu gibi OrderBy()ve kullanan koda derlenecektir ThenBy().

Ayrıca, OrderBy()bunun iki (veya daha fazla) sıralama anahtarı almasını istiyorsanız, IEnumerable<T>bunu dahili olarak yapılan aramalarda bir uzantı yöntemi olarak kesinlikle yazabilirsiniz OrderBy()ve ThenBy().


3

Sonraki alanlarınız ThenBy () yöntemi kullanılarak sıralanmalıdır.



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

2

Daha fazla dosyalanmış bir liste sipariş etmenin yolu şudur:

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

"ThenBy" sınıfıyla başka alanlar ekleyebilirsiniz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.