Witam.
Myślę nad następującym problemem: posiadam listę obiektów, które mają jakieś właściwości.
Muszę wyszukiwać elementy po ich nazwie (czyli odpowiedniej właściwości obiektu). Problemem jest to, że muszę wyświetlać wyniki w określonej kolejności, czyli po kolejnej właściwości - np. kategorii czyli tak jakby wadze danego elementu. Muszę wyświetlić najpierw elementy o właściwości równej X, potem Y, Z i pozostałe. Jak się do tego zabrać i co było by najlepszym rozwiązaniem tego problemu?
Proszę o pomoc.

- Rejestracja:prawie 11 lat
- Ostatnio:prawie 9 lat
- Postów:627
Założmy że jest przykładowy kod:
Klasa tego obiektu:
public class SearchObject
{
public int ID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string Category { get; set; }
}
i tak przykładowa lista elementow:
var list = new List<SearchObject>();
list.Add(new SearchObject { ID = 1, Name = "Element1", Description = "blabla", Category = "CatA" });
list.Add(new SearchObject { ID = 2, Name = "Element2", Description = "blabla", Category = "CatB" });
list.Add(new SearchObject { ID = 3, Name = "Element3", Description = "blabla", Category = "CatB" });
list.Add(new SearchObject { ID = 4, Name = "Element4", Description = "blabla", Category = "CatA" });
list.Add(new SearchObject { ID = 5, Name = "Element5", Description = "blabla", Category = "CatC" });
list.Add(new SearchObject { ID = 6, Name = "Element6", Description = "blabla", Category = "CatC" });
list.Add(new SearchObject { ID = 7, Name = "Element7", Description = "blabla", Category = "CatD" });
list.Add(new SearchObject { ID = 7, Name = "Element8", Description = "blabla", Category = "CatE" });
// Załóżmy, że wszyujemy nazwę po frazie Element i chcemy aby najpierw wyświetlone były elementy z kategorii CatB, potem CatC, potem CatA, i reszta dowolnie. Więc powinniśmy otrzymać listę wyników w następującej kolejności:
Element2
Element3
Element5
Element6
Element1
Element4
Element7
Element8
Mam nadzieję, że przybliżyłem problem.
- Rejestracja:ponad 10 lat
- Ostatnio:prawie 10 lat
- Postów:33
Masz kilka rozwiązań:
- SearchObject implementuje CompareTo z inferfejsu IComparable<SearchObject>. Tam ustawiasz warunki kolejności.
- Category jest osobną klasą i ona implementuje IComparable<Category>
- Jeżeli nie chcesz nic implementować możesz zrobić mały hack z linq (najbrzydsze rozwiązanie):
var sth = list.OrderBy(x => x.Category == "CatB" ? 0 :
x.Category == "CatC" ? 1 :
x.Category == "CatA" ? 2 : 3);
foreach (var z in sth)
{
Console.WriteLine(z.Category);
}
// 3) Jeżeli nie chcesz nic implementować możesz zrobić mały hack z linq (najbrzydsze rozwiązanie):
var sth = list.OrderBy(x => x.Category == "CatB" ? 0 :
x.Category == "CatC" ? 1 :
x.Category == "CatA" ? 2 : 3);
linq? A to nie jest przypadkiem wyrażenie lambda(skrótowe użycie metody anonimowej?
LINQ to chyba
var sth = select x from list where x.Category == "CatB"
Poprawcie mnie jeśli się mylę.
Poprawcie mnie jeśli się mylę.
Mylisz się. Są to tzw. Extension Methods, które dodają funkcjonalność do istniejących, skompilowanych już klas. Najbardziej popularnymi z nich są operatory LINQ. Właśnie dzięki takiemu zastosowaniu, możemy korzystać z LINQ we wcześniejszych wersjach .NET'a, w którym LINQ jeszcze nie istniało.