comment faire une recherche inversée de dictionnaire
J'ai un dictionnaire de type <string, string>
et pour un cas particulier, j'ai besoin de faire une recherche inversée. Ainsi, par exemple, supposons que j'ai cette entrée <"SomeString", "ab">
et que je passe dans "ab"
ensuite, je voudrais revenir "SomeString"
.
Avant de m'embarquer sur un foreach
boucle sur chaque entrée dans le dictionnaire, je me demandais quel serait le moyen le plus efficace pour ce faire de recherche inversée?
source d'informationauteur frenchie
Vous devez vous connecter pour publier un commentaire.
Fondamentalement, Vous pouvez utiliser
LINQ
et obtenir leKey
comme ça, sans inverser quoi que ce soit:Si vraiment vous voulez inverser votre Dictionnaire, vous pouvez utiliser une méthode d'extension comme ceci:
Alors vous pouvez l'utiliser comme ceci:
Remarque: si vous avez des valeurs, cette méthode permettra d'ajouter de la première
Value
et ignore les autres.Utiliser Linq
ToDictionary
fonction:Vous pouvez voir ci-dessous que cela fonctionne, testé dans Linqpad:
Comment sur l'utilisation de linq fonction ToDictionary:
1) les Clés sont uniques, les valeurs ne sont pas. Pour une valeur donnée de vous ont un ensemble de touches.
2) Recherche par clé est
O(log n)
. Itération avecforeach
ou LINQ estO(n)
.Donc
Option A: Itérer avec LINQ, passer
O(n)
par demande, pas de mémoire supplémentaire.Option B: Maintenir
Dictionary<ValueType, HashSet<KeyType>>
, passerO(log n)
par la demande, utilisationO(n)
de la mémoire supplémentaire. (Il y a deux sous-options: construire ce dictionnaire avant une série de look-ups; maintenir tout le temps)