In ASP.NET C # habe ich eine Struktur:
public struct Data
{
public int item1;
public int item2;
public int category_id;
public string category_name;
}
und ich habe eine Liste davon. Ich möchte auswählen category_id
und category_name
, läuft ein DISTINCT
und schließlich eine ORDERBY
auf category_name
.
Folgendes habe ich jetzt:
List<Data> listObject = getData();
string[] catNames = listObject
.Select(i=> i.category_name)
.Distinct()
.OrderByDescending(s => s)
.ToArray();
Dies erhält offensichtlich nur den Kategorienamen. Meine Frage ist, wie bekomme ich mehrere Felder und in welcher Datenstruktur speichere ich diese (nicht a string[]
)?
BEARBEITEN
Die Verwendung einer Liste von Strukturen ist nicht in Stein gemeißelt. Wenn es ratsam wäre, meine Hintergrunddatenstruktur zu ändern, um die Auswahl zu vereinfachen (ich werde viele davon schreiben), würde ich gerne Empfehlungen annehmen.
c#
linq
data-structures
Chet
quelle
quelle
Antworten:
Mit anonymen Typen können Sie beliebige Felder in Datenstrukturen auswählen, die später in Ihrem Code stark typisiert werden:
Da Sie es (anscheinend) zur späteren Verwendung speichern müssen, können Sie den GroupBy-Operator verwenden:
quelle
Select
in einen neuen Typ. In meinem Fall habe ich eine neue ausgewähltKeyValuePair
.Edit : Mehr LINQ-ey!
quelle
Sie könnten einen anonymen Typ verwenden:
Der Compiler generiert den Code für eine Klasse mit
name
undcategory_name
Eigenschaften und gibt Instanzen dieser Klasse zurück. Sie können Eigenschaftsnamen auch manuell angeben:Sie können eine beliebige Anzahl von Eigenschaften haben.
quelle
Sie können mit linq Select mehrere Felder auswählen, wie oben in verschiedenen Beispielen gezeigt. Dies wird als anonymer Typ zurückgegeben. Wenn Sie diesen anonymen Typ vermeiden möchten, ist hier der einfache Trick.
Ich denke, das löst dein Problem
quelle
Dies ist eine Aufgabe, für die anonyme Typen sehr gut geeignet sind. Sie können Objekte eines Typs zurückgeben, der vom Compiler automatisch erstellt wird und aus der Verwendung abgeleitet wird.
Die Syntax hat folgende Form:
Versuchen Sie für Ihren Fall Folgendes:
quelle
Dies verwendet anonyme Typen, daher müssen Sie das Schlüsselwort var verwenden, da der resultierende Typ des Ausdrucks nicht im Voraus bekannt ist.
quelle
quelle
Sie können es zu einem KeyValuePair machen, sodass a zurückgegeben wird
"IEnumerable<KeyValuePair<string, string>>"
Also wird es so sein:
quelle
quelle