Dans ASP.NET C #, j'ai une structure:
public struct Data
{
public int item1;
public int item2;
public int category_id;
public string category_name;
}
et j'en ai une liste. Je veux choisir category_id
et category_name
, en cours d' exécution d' un DISTINCT
et enfin un ORDERBY
sur category_name
.
Voici ce que j'ai maintenant:
List<Data> listObject = getData();
string[] catNames = listObject
.Select(i=> i.category_name)
.Distinct()
.OrderByDescending(s => s)
.ToArray();
Cela n'a évidemment que le nom de la catégorie. Ma question est la suivante: comment puis-je obtenir plusieurs champs et dans quelle structure de données vais-je les stocker (et non dans une string[]
)?
ÉDITER
L'utilisation d'une liste de structures n'est pas gravée dans la pierre. S'il serait souhaitable de modifier la structure de mes données de sauvegarde pour faciliter les sélections (j'en écrirai beaucoup), je serais ravi de prendre des recommandations.
c#
linq
data-structures
Chet
la source
la source
Réponses:
Les types anonymes vous permettent de sélectionner des champs arbitraires dans des structures de données qui sont fortement typées plus tard dans votre code:
Puisque vous devez (apparemment) le stocker pour une utilisation ultérieure, vous pouvez utiliser l'opérateur GroupBy:
la source
Select
un nouveau type. Dans mon cas, j'ai sélectionné dans un nouveauKeyValuePair
.Edit : fait plus LINQ-ey!
la source
Vous pouvez utiliser un type anonyme:
Le compilateur va générer le code pour une classe
name
etcategory_name
instances de propriétés et rendements de cette catégorie. Vous pouvez également spécifier manuellement les noms de propriétés:Vous pouvez avoir un nombre arbitraire de propriétés.
la source
Vous pouvez sélectionner plusieurs champs à l'aide de linq Select comme indiqué ci-dessus dans divers exemples, cela retournera comme un type anonyme. Si vous voulez éviter ce type anonyme, voici une astuce simple.
Je pense que cela résout ton problème
la source
C'est une tâche pour laquelle les types anonymes sont très bien adaptés. Vous pouvez renvoyer des objets d'un type créé automatiquement par le compilateur, déduit de l'utilisation.
La syntaxe est de cette forme:
Pour votre cas, essayez quelque chose comme ce qui suit:
la source
Cela utilise des types anonymes, vous devez donc utiliser le mot-clé var, car le type résultant de l'expression n'est pas connu à l'avance.
la source
la source
Vous pouvez en faire un KeyValuePair, il renverra donc un
"IEnumerable<KeyValuePair<string, string>>"
Donc, ce sera comme ça:
la source
la source