Sélectionnez un dictionnaire <T1, T2> avec LINQ


171

J'ai utilisé le mot clé "select" et la méthode d'extension pour renvoyer un IEnumerable<T>avec LINQ, mais j'ai besoin de renvoyer un générique Dictionary<T1, T2>et je ne peux pas le comprendre. L'exemple que j'ai appris en utilisant quelque chose sous une forme similaire à la suivante:

IEnumerable<T> coll = from x in y 
    select new SomeClass{ prop1 = value1, prop2 = value2 };

J'ai également fait la même chose avec les méthodes d'extension. J'ai supposé que puisque les éléments de a Dictionary<T1, T2>peuvent être itérés, KeyValuePair<T1, T2>je pouvais simplement remplacer "SomeClass" dans l'exemple ci-dessus par " new KeyValuePair<T1, T2> { ...", mais cela ne fonctionnait pas (la clé et la valeur étaient marquées en lecture seule, je ne pouvais donc pas compiler ce code ).

Est-ce possible ou dois-je le faire en plusieurs étapes?

Merci.

Réponses:


284

Les méthodes d'extensions fournissent également une extension ToDictionary . Il est assez simple à utiliser, l'utilisation générale consiste à passer un sélecteur lambda pour la clé et à obtenir l'objet comme valeur, mais vous pouvez passer un sélecteur lambda pour la clé et la valeur.

class SomeObject
{
    public int ID { get; set; }
    public string Name { get; set; }
}

SomeObject[] objects = new SomeObject[]
{
    new SomeObject { ID = 1, Name = "Hello" },
    new SomeObject { ID = 2, Name = "World" }
};

Dictionary<int, string> objectDictionary = objects.ToDictionary(o => o.ID, o => o.Name);

Puis objectDictionary[1]contiendrait la valeur "Bonjour"


44
var dictionary = (from x in y 
                  select new SomeClass
                  {
                      prop1 = value1,
                      prop2 = value2
                  }
                  ).ToDictionary(item => item.prop1);

Cela suppose que SomeClass.prop1c'est ce que l'on souhaite Keypour le dictionnaire.


27
.ToDictionary(item => item.prop1, item => item.prop2);pour explicitement définir la valeur aussi.
— finoutlook

42

Une collection de KeyValuePairest encore plus explicite et s'exécute très bien.

Dictionary<int, string> dictionary = objects
    .Select(x=> new KeyValuePair<int, string>(x.Id, x.Name))
    .ToDictionary(x=>x.Key, x=>x.Value);

Est-il possible de supprimer .ToDictionary (x => x.Key, x => x.Value); et remplacer le nouveau KeyValuePair par un nouveau dictionnaire?
— Amir Hajiha

@ AmirNo-Family Vous vous trompez. La méthode Select (x => x ...) effectue une projection pour chaque élément de la collection d' objets . Donc, remplacer le nouveau KeyValuePair par un nouveau dictionnaire créerait un dictionnaire de dictionnaires. Je ne pense pas que ce soit ce que vous visez.
— Antoine Meltzheim

J'ai une liste de Dictionary <string, string> et j'essayais d'utiliser select sur eux mais cela lève une erreur de compilation.
— Amir Hajiha
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.