W ASP.NET C # mam strukturę:
public struct Data
{
public int item1;
public int item2;
public int category_id;
public string category_name;
}
i mam ich listę. Chcę wybrać category_id
i category_name
, prowadzenie DISTINCT
i wreszcie ORDERBY
na category_name
.
Oto, co mam teraz:
List<Data> listObject = getData();
string[] catNames = listObject
.Select(i=> i.category_name)
.Distinct()
.OrderByDescending(s => s)
.ToArray();
To oczywiście otrzymuje tylko nazwę kategorii. Moje pytanie brzmi: w jaki sposób mogę uzyskać wiele pól i w jakiej strukturze danych będę to przechowywać (nie a string[]
)?
EDYTOWAĆ
Korzystanie z listy struktur nie jest nieodłączne. Jeśli byłaby wskazana zmiana struktury danych kopii zapasowej, aby ułatwić wybieranie (będę pisać wiele z nich), z przyjemnością skorzystam z zaleceń.
c#
linq
data-structures
Chet
źródło
źródło
Odpowiedzi:
Typy anonimowe umożliwiają wybranie dowolnych pól w strukturach danych, które są silnie wpisywane później w kodzie:
Ponieważ (najwyraźniej) musisz przechowywać go do późniejszego użytku, możesz użyć operatora GroupBy:
źródło
Select
o nowym typie. W moim przypadku wybrałem nowyKeyValuePair
.Edycja : uczyniłem to bardziej LINQ-ey!
źródło
Możesz użyć anonimowego typu:
Kompilator generowania kodu dla klasie
name
icategory_name
właściwości i zwraca przypadkach tej klasy. Możesz również ręcznie określić nazwy właściwości:Możesz mieć dowolną liczbę właściwości.
źródło
Możesz wybrać wiele pól za pomocą linq Select, jak pokazano powyżej w różnych przykładach, zwróci to jako typ anonimowy. Jeśli chcesz uniknąć tego anonimowego typu, oto prosta sztuczka.
Myślę, że to rozwiązuje twój problem
źródło
Jest to zadanie, do którego bardzo dobrze nadają się typy anonimowe . Możesz zwrócić obiekty typu, który jest tworzony automatycznie przez kompilator, wywnioskowany na podstawie użycia.
Składnia ma następującą postać:
W swoim przypadku spróbuj czegoś takiego:
źródło
Używa to typów anonimowych, więc musisz użyć słowa kluczowego var, ponieważ wynikowy typ wyrażenia nie jest z góry znany.
źródło
źródło
Możesz ustawić go jako KeyValuePair, więc zwróci plik
"IEnumerable<KeyValuePair<string, string>>"
A więc będzie tak:
źródło
źródło