web-dev-qa-db-fra.com

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

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 Dictionary<T1, T2> Générique et je n'arrive pas à le comprendre. L'exemple que j'ai appris en utilisant quelque chose sous une forme semblable à celle-ci:

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 dans un Dictionary<T1, T2> Peuvent être itérés comme KeyValuePair<T1, T2>, Je pourrais simplement remplacer "SomeClass" dans l'exemple ci-dessus par "new KeyValuePair<T1, T2> { ...", Mais cela n'a pas été utile. t work (Key et Value ont été marqués en lecture seule, je n’ai donc pas pu compiler ce code).

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

Merci.

156
Rich

Les méthodes d'extensions fournissent également une extension ToDictionary . Il est relativement simple à utiliser. L’usage général consiste à passer un sélecteur lambda pour la clé et à obtenir l’objet en tant que valeur, mais vous pouvez utiliser 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);

Ensuite objectDictionary[1] Contiendrait la valeur "Bonjour"

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

Cela suppose que SomeClass.prop1 est le Key souhaité pour le dictionnaire.

42
albertein

Une collection de KeyValuePair est 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);
27
Antoine Meltzheim