Recréer un dictionnaire à partir d'un IEnumerable <KeyValuePair <>>


173

J'ai une méthode qui renvoie un IEnumerable<KeyValuePair<string, ArrayList>>, mais certains des appelants exigent que le résultat de la méthode soit un dictionnaire. Comment puis-je convertir le IEnumerable<KeyValuePair<string, ArrayList>>en un Dictionary<string, ArrayList>pour pouvoir l'utiliser TryGetValue?

méthode:

public IEnumerable<KeyValuePair<string, ArrayList>> GetComponents()
{
  // ...
  yield return new KeyValuePair<string, ArrayList>(t.Name, controlInformation);
}

votre interlocuteur:

Dictionary<string, ArrayList> actual = target.GetComponents();
actual.ContainsKey("something");

Réponses:


329

Si vous utilisez .NET 3.5 ou .NET 4, il est facile de créer le dictionnaire à l'aide de LINQ:

Dictionary<string, ArrayList> result = target.GetComponents()
                                      .ToDictionary(x => x.Key, x => x.Value);

Il n'y a rien de tel qu'un IEnumerable<T1, T2>mais KeyValuePair<TKey, TValue>c'est bien.


15
On pourrait penser qu'il y aurait un appel qui ne nécessite pas d'arguments, étant donné que Dictionary <TKey, TValue> implémente IEnumerable <KeyValuePair <TKey, TValue >>, mais bon. Assez simple pour créer le vôtre.
— Casey

6
@DanVerdolino Je le sais. Vous penseriez cela parce que c'est comme l'une des choses les plus courantes que vous pourriez vouloir faire avec un IEnumerable de KVP.
— Casey

17
2016 maintenant, et je devais encore chercher sur Google. On pourrait penser qu'il y aurait un constructeur pour Dictionaryqui a pris un IEnumerable<KeyValuePair<TKey, TValue>>comme List<T>prend un IEnumerable<T>. Il n'y a pas non plus AddRangeou même Addcela prend des paires clé / valeur. Qu'est-ce qui se passe avec ça?
— die maus

5
Nous sommes en 2017 maintenant, et nous pouvons l'ajouter comme méthode d'extension!
— Chris Bush

2
Beaucoup de "Je ne peux pas croire que .net core n'ait pas de <fonctionnalité évidente>" est résolu via MoreLinq . Incluant un IEnumerable <KeyValuePair> sans paramètre ->ToDictionary()
— aaaaaa

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.