Wyszukiwanie i sortowanie wyników

0

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.

0

Pokaż co zrobiłeś do tej pory.

0

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.

0

Masz kilka rozwiązań:

  1. SearchObject implementuje CompareTo z inferfejsu IComparable<SearchObject>. Tam ustawiasz warunki kolejności.
  2. Category jest osobną klasą i ona implementuje IComparable<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);
                                        
foreach (var z in sth)
{
       Console.WriteLine(z.Category);
}
 
0
// 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ę.

0

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1