Mam ciąg „sortuj według właściwości”. Będę musiał użyć Lambda / Linq do posortowania listy obiektów.
Dawny:
public class Employee
{
public string FirstName {set; get;}
public string LastName {set; get;}
public DateTime DOB {set; get;}
}
public void Sort(ref List<Employee> list, string sortBy, string sortDirection)
{
//Example data:
//sortBy = "FirstName"
//sortDirection = "ASC" or "DESC"
if (sortBy == "FirstName")
{
list = list.OrderBy(x => x.FirstName).toList();
}
}
- Zamiast używać paczki ifs do sprawdzania nazwy pola (sortBy), istnieje bardziej przejrzysty sposób sortowania
- Czy sort jest świadomy typu danych?
c#
linq
lambda
linq-to-objects
DotnetDude
źródło
źródło
==
... czym?Odpowiedzi:
Można to zrobić jako
Framework .NET rzuca lambda
(emp1,emp2)=>int
jakoComparer<Employee>.
Ma to tę zaletę, że jest mocno wpisane.
źródło
list.sort(functionDeclaredElsewhere)
Jedną rzeczą, którą możesz zrobić, to zmienić,
Sort
aby lepiej wykorzystywać lambdas.Teraz możesz określić pole do sortowania podczas wywoływania
Sort
metody.źródło
Możesz użyć Reflection, aby uzyskać wartość właściwości.
Gdzie TypeHelper ma metodę statyczną, taką jak:
Możesz także zajrzeć na Dynamic LINQ z biblioteki próbek VS2008 . Możesz użyć rozszerzenia IEnumerable, aby rzutować Listę jako IQueryable, a następnie użyć rozszerzenia Dynamic Link OrderBy.
źródło
collection.ToList().OrderBy(x => TypeHelper.GetPropertyValue( x, sortBy)).ToList();
Oto jak rozwiązałem mój problem:
źródło
Budowanie porządku przez wyrażenie można przeczytać tutaj
Bezwstydnie skradziony ze strony w linku:
źródło
Możesz użyć refleksji, aby uzyskać dostęp do nieruchomości.
Notatki
źródło
Sort używa interfejsu IComparable, jeśli typ go implementuje. I możesz uniknąć ifs, wdrażając niestandardowy IComparer:
i wtedy
źródło
Odpowiedź na 1 .:
Powinieneś być w stanie ręcznie zbudować drzewo wyrażeń, które można przekazać do OrderBy, używając nazwy jako łańcucha. Lub możesz użyć refleksji, jak sugerowano w innej odpowiedzi, co może być mniej pracy.
Edycja : Oto działający przykład ręcznego budowania drzewa wyrażeń. (Sortowanie według X.Value, znając tylko nazwę „Wartość” właściwości). Możesz (powinieneś) zbudować ogólną metodę do tego.
Jednak zbudowanie drzewa wyrażeń wymaga znajomości typów cząstek. To może, ale nie musi stanowić problemu w twoim scenariuszu użytkowania. Jeśli nie wiesz, na jakim typie powinieneś sortować, łatwiej będzie użyć odbicia.
Odpowiedź na 2 .:
Tak, ponieważ porównywarka zostanie użyta do porównania, jeśli nie zdefiniujesz wyraźnie porównania.
źródło
Kolejny, tym razem dla każdego IQueryable:
Możesz przekazać wiele kryteriów sortowania, takich jak to:
źródło
Rozwiązanie dostarczone przez Rashack nie działa niestety dla typów wartości (int, enums itp.).
Oto rozwiązanie, które znalazłem:
źródło
Dodanie do tego, co zrobili @Samuel i @bluish. Jest to o wiele krótsze, ponieważ Enum nie było w tym przypadku niepotrzebne. Dodatkowo jako dodatkowy bonus, gdy Rosnąco jest pożądanym wynikiem, możesz przekazać tylko 2 parametry zamiast 3, ponieważ prawda jest domyślną odpowiedzią na trzeci parametr.
źródło
Jeśli otrzymujesz nazwę kolumny sortowania i kierunek sortowania jako ciąg znaków i nie chcesz używać przełącznika lub składni if \ else do określenia kolumny, to ten przykład może być dla Ciebie interesujący:
Rozwiązanie oparte na użyciu słownika, który łączy potrzebne do sortowania kolumny poprzez wyrażenie> i jej ciąg klucza.
źródło