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");
plaques d'apprentissage
la source
Duplicata possible? stackoverflow.com/questions/7850334/…
Coolkau

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.

Jon Skeet
la source
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