Existe-t-il des classes de dictionnaire dans la bibliothèque de classes de base .NET qui permettent d'utiliser des clés en double? La seule solution que j'ai trouvée est de créer, par exemple, une classe comme:
Dictionary<string, List<object>>
Mais c'est assez irritant à utiliser. En Java, je crois qu'un MultiMap accomplit cela, mais ne trouve pas d'analogue dans .NET.
c#
.net
dictionary
multimap
Escargot mécanique
la source
la source
{ a, 1 }
et{ a, 2 }
dans une table de hachage oùa
être la clé, une alternative est d'avoir{ a, [1, 2] }
.Réponses:
Si vous utilisez .NET 3.5, utilisez la
Lookup
classe.EDIT: Vous créez généralement une
Lookup
utilisationEnumerable.ToLookup
. Cela suppose que vous n'avez pas besoin de le changer par la suite - mais je trouve généralement que c'est assez bon.Si cela ne fonctionne pas pour vous, je ne pense pas qu'il y ait quoi que ce soit dans le cadre qui vous aidera - et l'utilisation du dictionnaire est aussi bonne que possible :(
la source
Lookup
n'est pas sérialisableLa classe List fonctionne en fait assez bien pour les collections clé / valeur contenant des doublons où vous souhaitez parcourir la collection. Exemple:
la source
Voici une façon de le faire avec List <KeyValuePair <string, string>>
Sorties k1 = v1, k1 = v2, k1 = v3
la source
Si vous utilisez des chaînes à la fois comme clés et comme valeurs, vous pouvez utiliser System.Collections.Specialized.NameValueCollection , qui renverra un tableau de valeurs de chaîne via la méthode GetValues (chaîne clé).
la source
Je viens de découvrir la bibliothèque PowerCollections qui comprend, entre autres, une classe appelée MultiDictionary. Cela enveloppe parfaitement ce type de fonctionnalité.
la source
Remarque très importante concernant l'utilisation de la recherche:
Vous pouvez créer une instance d'un
Lookup(TKey, TElement)
en appelantToLookup
un objet qui implémenteIEnumerable(T)
Il n'y a pas de constructeur public pour créer une nouvelle instance de a
Lookup(TKey, TElement)
. De plus, lesLookup(TKey, TElement)
objets sont immuables, c'est-à-dire que vous ne pouvez pas ajouter ou supprimer des éléments ou des clés d'unLookup(TKey, TElement)
objet après sa création.(à partir de MSDN)
Je pense que ce serait un bouchon d'exposition pour la plupart des utilisations.
la source
Je pense que quelque chose comme
List<KeyValuePair<object, object>>
ça ferait le travail.la source
Si vous utilisez> = .NET 4, vous pouvez utiliser
Tuple
Class:la source
List<KeyValuePair<key, value>>
solution comme celle ci-dessus. Ai-je tort?Il est assez facile de "rouler votre propre" version d'un dictionnaire qui permet des entrées de "clé en double". Voici une implémentation simple et approximative. Vous voudrez peut-être envisager d'ajouter la prise en charge de la plupart des applications (sinon toutes)
IDictionary<T>
.Un exemple rapide sur la façon de l'utiliser:
la source
En réponse à la question d'origine. Quelque chose comme
Dictionary<string, List<object>>
est implémenté dans une classe appeléeMultiMap
dans TheCode Project
.Vous pouvez trouver plus d'informations sur le lien ci-dessous: http://www.codeproject.com/KB/cs/MultiKeyDictionary.aspx
la source
NameValueCollection prend en charge plusieurs valeurs de chaîne sous une seule clé (qui est également une chaîne), mais c'est le seul exemple que je connaisse.
J'ai tendance à créer des constructions similaires à celle de votre exemple lorsque je rencontre des situations où j'ai besoin de ce type de fonctionnalité.
la source
Lorsque vous utilisez l'
List<KeyValuePair<string, object>>
option, vous pouvez utiliser LINQ pour effectuer la recherche:la source
Depuis le nouveau C # (je crois que c'est de la version 7.0), vous pouvez également faire quelque chose comme ceci:
et vous l'utilisez comme une liste standard, mais avec deux valeurs nommées comme vous le souhaitez
la source
Voulez-vous dire congruent et non un double réel? Sinon, une table de hachage ne pourrait pas fonctionner.
Congruent signifie que deux clés distinctes peuvent hacher à la valeur équivalente, mais les clés ne sont pas égales.
Par exemple: supposons que la fonction de hachage de votre table de hachage était juste hashval = key mod 3. Les 1 et 4 sont mappés sur 1, mais sont des valeurs différentes. C'est là que votre idée de liste entre en jeu.
Lorsque vous devez rechercher 1, cette valeur est hachée à 1, la liste est parcourue jusqu'à ce que la clé = 1 soit trouvée.
Si vous autorisiez l'insertion de clés en double, vous ne seriez pas en mesure de différencier quelles clés correspondent à quelles valeurs.
la source
La façon dont j'utilise est juste un
Dictionary<string, List<string>>
De cette façon, vous avez une seule clé contenant une liste de chaînes.
Exemple:
la source
Je suis tombé sur ce post à la recherche de la même réponse et n'en ai trouvé aucune, j'ai donc truqué un exemple de solution à nu en utilisant une liste de dictionnaires, remplaçant l'opérateur [] pour ajouter un nouveau dictionnaire à la liste lorsque tous les autres ont un clé donnée (set), et retourne une liste de valeurs (get).
C'est moche et inefficace, il obtient / définit UNIQUEMENT par clé, et il renvoie toujours une liste, mais cela fonctionne:
la source
J'ai changé la réponse de @Hector Correa en une extension avec des types génériques et y ai également ajouté un TryGetValue personnalisé.
la source
Ceci est un moyen de remorquage Dictionnaire simultané Je pense que cela vous aidera:
exemples:
la source
j'utilise cette classe simple:
usage:
la source
Vous pouvez créer votre propre enveloppe de dictionnaire, quelque chose comme celui-ci, en prime, il prend en charge la valeur null comme clé:
L'échantillon d'utilisation:
la source
var dictionary = new OpenDictionary<string, int>(); dictionary.Add("1", 1); // The next line won't throw an exception; dictionary.Add("1", 2); dictionary.TryGetEntries("1", out List<int> result); // result is { 1, 2 }
Vous pouvez définir une méthode pour construire une clé de chaîne composée partout où vous voulez utiliser un dictionnaire, vous devez utiliser cette méthode pour construire votre clé, par exemple:
pour l'utilisation:
la source
Les clés en double rompent l'intégralité du contrat du dictionnaire. Dans un dictionnaire, chaque clé est unique et mappée sur une seule valeur. Si vous souhaitez lier un objet à un nombre arbitraire d'objets supplémentaires, le meilleur pari pourrait être quelque chose de semblable à un DataSet (dans le langage courant une table). Mettez vos clés dans une colonne et vos valeurs dans l'autre. C'est beaucoup plus lent qu'un dictionnaire, mais c'est votre compromis pour perdre la capacité de hacher les objets clés.
la source
Cela est également possible:
De cette façon, nous pouvons avoir des clés uniques. J'espère que cela fonctionne pour toi.
la source
Vous pouvez ajouter les mêmes clés avec différents cas comme:
key1
Key1
KEY1
KeY1
kEy1
keY1
Je sais que c'est une réponse fictive, mais ça a marché pour moi.
la source