2010-08-03 4 views

Répondre

4

Quelque chose comme ceci:

var distinct = dictionary.Values.SelectMany(x => x) 
           .Distinct(); 

J'ai décidé de garder cette réponse malgré Marc ayant un poste équivalent - il est instructif de voir à la fois approches. Dans mon approche, nous prenons la séquence de valeurs - chacune étant IEnumerable<Control> et l'aplatissons en disant: «Pour chaque valeur, nous voulons obtenir un IEnumerable<Control> juste en prenant cette vaule. L'approche de Marc prend la séquence des paires clé/valeur et aplatit cela en disant: "Pour chaque paire, nous voulons obtenir un IEnumerable<Control> en prenant la valeur de la paire."

Dans les deux cas, SelectMany prend la séquence de séquences de résultat, et les aplatit en une séquence unique - si le résultat avant l'appel Distinct() est effectivement la séquence { contents, building, view1, contents, view2, building, view3 }. L'appel Distinct donnera alors la séquence { contents, building, view1, view2, view3 }.

+0

Eh bien, si vous allez aller et * expliquer * les choses; p Mon raisonnement est que peut-être que l'approche par paire a moins d'indirection (via 'ValueCollection' etc.). Mais l'un ou l'autre va fonctionner. –

+0

Merci à tous, J'ai donné le crédit à Jon comme il l'a expliqué, car je ne peux pas déterminer qui a posté en premier. Désolé Marc. Podge – Podge

6
var controls = yourDictionary.SelectMany(pair => pair.Value).Distinct(); 
+2

Marc Gravell vs Jon Skeet, quelle bataille! :) – Andrey

+2

@Andrey - même * si * Je gagne occasionnellement la "bataille" étrange, je pense que nous savons à qui appartient la guerre, p –

1
var distinctControls = dictionary.Values.SelectMany(x=>x).Distinct(); 
Questions connexes