2011-12-08 8 views
7

Mam klasę Offer, która zawiera kategorię plików.Sortuj listę tak, aby konkretna wartość znalazła się na górze

Chcę, aby wszystkie oferty określonej kategorii pojawiały się na górze, a następnie wszystkie inne.

Próbowałem tego, ale bez rezultatu, co poleciłbyś?

Offers = Offers.OrderBy(x => x.Category == "Corporate").ToList(); 
+0

Kiedy mówisz "bez skutku", jaki jest rezultat tego wyrażenia? Co jest z tym nie tak? –

+0

spójrz na http://stackoverflow.com/questions/728319/linq-orderby-against-specific-values ​​ –

+1

To nie sortuje się prawidłowo, wydaje się, że nadal jest w oryginalnej kolejności. – Wesley

Odpowiedz

19

Kiedy zamówić przez wartość logiczną false (0) przychodzi przed true (1). Aby dostać się elementy, które pasują do predykatu najpierw należy odwrócić kolejność sortowania za pomocą OrderByDescending:

Offers = Offers.OrderByDescending(x => x.Category == "Corporate").ToList(); 
+0

+1 fajne rozwiązanie –

+0

Uh, ale to odwróci kolejność wszystkiego innego. Zamiast tego użyj 'OrderBy (x => x.Category! =" Corporate ")'. –

+3

+1. A może dodanie ThenBy (x => x.Category) do sortowania pozostałych ofert według nazwy kategorii ..? –

10

C# Language Specification 5.0 nie określa reprezentacją dla wartości true i false. Dlatego lepiej nie opierać się na założeniu, że true jest reprezentowany przez 1. Ponadto wynik sortowania według wyrażenia Boolean x.Category == "Corporate" nie jest oczywisty, ponieważ true może być również reprezentowany przez wartość ujemną. Dlatego używam operatora potrójnego do jawnego określenia wartości sortowania:

Offers = Offers 
    .OrderBy(x => x.Category == "Corporate" ? 0 : 1) 
    .ThenBy(x => x.Category) 
    .ThenBy(x => x.Date) // or what ever 
    .ToList(); 
Powiązane problemy