Je recherche une classe Dictionary 1 à 1 générique et bidirectionnelle en C # (2), ie. a BiDictionaryOneToOne<T, S>
qui est garanti de ne contenir qu'une seule de chaque valeur et clé (jusqu'à RefEquals de toute façon), et qui peut être recherchée en utilisant soit la clé soit la valeur. Quelqu'un en connaît un ou devrais-je simplement le mettre en œuvre moi-même? Je ne peux pas croire que je suis la première personne à avoir besoin de ça ...
Il y a un BiDictionary dans les réponses à cette question , mais ce n'est pas pour les éléments uniques (et n'implémente pas non plus RemoveByFirst (T t) ou RemoveBySecond (S)).
Merci!
c#
.net
collections
Joel à Gö
la source
la source
Réponses:
OK, voici ma tentative (en s'appuyant sur Jon - merci), archivée ici et ouverte pour amélioration:
la source
Une implémentation plus complète du dictionnaire bidirectionnel:
Dictionary<TKey,TValue>
(à l'exception des interfaces d'infrastructure):IDictionary<TKey, TValue>
IReadOnlyDictionary<TKey, TValue>
IDictionary
ICollection<KeyValuePair<TKey, TValue>>
(celui-ci et ci-dessous sont les interfaces de base de ceux ci-dessus)ICollection
IReadOnlyCollection<KeyValuePair<TKey, TValue>>
IEnumerable<KeyValuePair<TKey, TValue>>
IEnumerable
SerializableAttribute
.DebuggerDisplayAttribute
(avec informations sur le nombre) etDebuggerTypeProxyAttribute
(pour afficher les paires clé-valeur dans les montres).IDictionary<TValue, TKey> Reverse
propriété et implémente également toutes les interfaces mentionnées ci-dessus. Toutes les opérations sur l'un ou l'autre des dictionnaires modifient les deux.Usage:
Le code est disponible dans mon framework privé sur GitHub: BiDictionary (TFirst, TSecond) .cs ( permalien , recherche ).
Copie:
la source
item.Reverse
lignes. Des exigences de version particulières?KeyValuePairExts
classe au bas de l'extrait de code.La question à laquelle vous faites référence montre également une implémentation un-à-un dans cette réponse . L'ajout de RemoveByFirst et RemoveBySecond serait trivial - tout comme l'implémentation d'interfaces supplémentaires, etc.
la source
C'est la même chose que la réponse acceptée, mais j'ai également fourni des
Update
méthodes, et dans l'ensemble un peu plus étoffées:Similaire à ma réponse ici
Peu de choses à noter:
J'ai mis en œuvre seulement
IEnumerable<>
. Je ne pense pas avoir deICollection<>
sens ici car les noms de méthodes pourraient tous être très différents pour cette structure de collection spéciale. A vous de décider de ce qui doit entrer à l'intérieurIEnumerable<>
. Alors maintenant, vous avez également une syntaxe d'initialisation de collection, commeJ'ai essayé de lancer des exceptions étranges ici et là - juste pour l'intégrité des données. Juste pour être plus sûr afin que vous sachiez si jamais mon code a des bogues.
Performances: Vous pouvez rechercher
Value
avec l'un ou l'autre desKeys
, ce qui signifieGet
et laContains
méthode ne nécessitent qu'une seule recherche (O (1)).Add
nécessite 2 recherches et 2 ajouts.Update
nécessite 1 recherche et 2 ajouts.Remove
prend 3 recherches. Tous semblables à la réponse acceptée.la source
IEnumerator<Tuple<TKey1, TKey2>>
ici. NonIEnumerator<KeyValuePair<TKey1, TKey2>>
, donc je pense que je ne peux pas faire cela à ma fonction GetEnumerator. Vous ai-je bien compris?J'ai créé une telle classe, en utilisant les classes de collection C5.
la source
Une autre extension de la réponse acceptée. Il implémente IEnumerable afin que l'on puisse utiliser foreach avec ça. Je me rends compte qu'il y a plus de réponses avec l'implémentation IEnumerable mais celle-ci utilise des structures, donc elle est conviviale pour le ramasse - miettes . Ceci est particulièrement utile dans le moteur Unity (vérifié avec le profileur).
la source
Un peu tard, mais voici une implémentation que j'ai écrite il y a quelque temps. Il gère quelques cas extrêmes intéressants, comme lorsque la clé remplace le contrôle d'égalité pour effectuer une égalité partielle. Il en résulte le stockage du dictionnaire principal
A => 1
mais le stockage inverse1 => A'
.Vous accédez au dictionnaire inverse via la
Inverse
propriété.Source originale et tests sur github.
la source