LINQ: obtention de clés pour une liste donnée de valeurs du dictionnaire et vice versa
Je avoir la structure suivante dans mon code Dictionary<TKeys, TValues> data;
.
Je exécutez des requêtes LINQ sur les deux types de données et ont souvent besoin de basculer entre les Keys
et Values
.
Quelle est la meilleure façon d'obtenir la liste des Clés pour les Valeurs et vice-versa?
S'il vous plaît, remarquez, que j'ai l'habitude de 'IEnumerable" et "IEnumerable' la suite de mon précédent requêtes LINQ et je voudrais avoir quelque chose comme IEnumerable<TKeys> Dictionary.GetAllKeys(IEnumerable<IValues> vals)
et IEnumerable<TValues> Dictionary.GetAllValues(IEnumerable<IKeys> keys)
.
Peut-être que j'ai besoin d'autres données de conteneur pour cette tâche?
Ce qui concerne,
Alexander.
source d'informationauteur Alexander Galkin
Vous devez vous connecter pour publier un commentaire.
Un
Dictionary<,>
n'est vraiment pas idéal pour trouver les clés de la valeur. Vous pourriez écrire un dictionnaire bidirectionnel, comme Je l'ai fait dans cette réponsemais il ne serait pas nécessairement être la meilleure approche.Bien sûr, vous peut utiliser un dictionnaire comme une séquence de paires clé/valeur, de sorte que vous pourriez avoir:
Juste être conscient ce sera un O(n), même si vos "valeurs" est un
HashSet
ou quelque chose de similaire (avec une efficacité de confinement à vérifier).EDIT: Si vous n'avez pas vraiment besoin d'une clé/valeur, relation s'il est plus comme ils sont juste des paires - puis à l'aide de
List<Tuple<Foo, Bar>>
ferait une certaine quantité de sens. La requête finit par être le même, en gros:La meilleure approche est d'effectuer votre requête linq sur la collection de paires clé-valeur, puis utiliser une sélection de projection pour sélectionner les Touches ou les Valeurs à la fin de votre requête. De cette façon, il n'est pas nécessaire d'effectuer une recherche à la fin de votre requête.
Par exemple: