Requête LINQ pour renvoyer un dictionnaire <chaîne, chaîne>

218

J'ai une collection de MyClass que j'aimerais interroger à l'aide de LINQ pour obtenir des valeurs distinctes et récupérer un dictionnaire <chaîne, chaîne> comme résultat, mais je ne peux pas comprendre comment je peux le faire plus simplement que moi fais ci-dessous. Quel code plus propre serais-je en mesure d'utiliser pour obtenir le dictionnaire <chaîne, chaîne> comme résultat?

var desiredResults = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);

var queryResults = (from MyClass mc in myClassCollection
                    orderby bp.SomePropToSortOn
                    select new KeyValuePair<string, string>(mc.KeyProp, mc.ValueProp)).Distinct();

foreach (var item in queryResults)
{
    desiredResults.Add(item.Key.ToString(), item.Value.ToString());
}
Scott Ivey
la source
6
Que voulez-vous qu'il fasse avec les clés en double? Prenez le premier et ignorez les suivants? Sachez que les dictionnaires ne sont pas commandés, donc votre commande dans la requête n'aura aucun effet ...
Jon Skeet
1
Peut-être que vous recherchez l'implémentation SortedDictionary d'IDictionary. Sinon, le tri sur un dictionnaire est inutile.
Fede

Réponses:

366

Utilisez ToDictionarydirectement la méthode.

var result = 
  // as Jon Skeet pointed out, OrderBy is useless here, I just leave it 
  // show how to use OrderBy in a LINQ query
  myClassCollection.OrderBy(mc => mc.SomePropToSortOn)
                   .ToDictionary(mc => mc.KeyProp.ToString(), 
                                 mc => mc.ValueProp.ToString(), 
                                 StringComparer.OrdinalIgnoreCase);
Mehrdad Afshari
la source
1
Mehrdad, merci pour le pointeur à ce sujet. C'était la direction dans laquelle j'allais, mais pour avoir dû ignorer la surcharge correcte de ToDictionary.
Scott Ivey
18

Regardez les méthodes ToLookupet / ou d' ToDictionaryextension.

leppie
la source