J'écris un bijective dictionary class, mais je veux m'assurer que les deux types génériques ne sont pas du même type pour deux raisons.Utilisation Où spécifier différents génériques
Tout d'abord, je voudrais à mettre en œuvre l'interface IDictionary
dans les deux sens, mais
public class BijectiveDictionary<TKey, TValue>
: IDictionary<TKey, TValue>, IDictionary<TValue, TKey>
me donne " 'BijectiveDictionary < TKey, TValue >' ne peut pas mettre en œuvre à la fois 'IDictionary < TKey, TValue >' et 'IDictionary < TValue, TKey >' parce qu'ils peuvent unifier pour certaines substitutions de paramètres de type "(ce qui est compréhensible, mais indésirable.)
Deuxièmement, je voudrais écrire un opt solution imitée si les deux types sont les mêmes.
public class BijectiveDictionary<TKey, TValue>
: IDictionary<TKey, TValue> where TValue : TKey
{
// Optimized solution
}
public class BijectiveDictionary<TKey, TValue>
: IDictionary<TKey, TValue>, IDictionary<TValue, TKey> where TValue : !TKey
{
// Standard solution
}
Est-ce possible?
Sinon, je peux envisager de ne pas mettre en œuvre IDictionary
, mais je ne pouvais pas garantir TValue this[TKey key]
et TKey this[TValue key]
serait différent, ce qui serait regrettable.
Il semble que le problème ici est que lorsque les deux types sont les mêmes, les cas spéciaux se présentent. Mon intention initiale était de créer un dictionnaire qui mappe exactement une clé à exactement une valeur, et inversement, de sorte que pour chaque KeyValuePair<TKey, TValue>(X, Y)
, un existe également.
Lorsque TKey
= TValue
, cela peut être simplifié vers le bas à un seul dictionnaire:
public T this[T key]
{
get { return this[key]; }
set
{
base.Add(key, value);
base.Add(value, key);
}
}
Dans ce cas, vous ne pouvez pas Add(2,3); Add(3,4)
parce Add(2,3)
cartes 3
-2
aussi bien, et [3]
retournerait 2
.
Toutefois, Jaroslav Jandek's solution a proposé d'utiliser un deuxième dictionnaire pour ce faire dans les cas où TKey
! = TValue
. Et bien que cela fonctionne merveilleusement pour ces cas, (et ce que j'ai décidé de mettre en œuvre, à la fin) il ne suit pas tout à fait mon intention quand TKey
= TValue
, en permettant Add(2,3); Add(3,4)
de mapper une seule clé 3
à deux valeurs (2
dans dans l'autre sens, et 4
), même si je crois à proprement parler, c'est encore une fonction bijective valide.
Qu'est-ce que vous utilisez le dictionnaire pour? Avez-vous besoin de la partie surjection de votre dictionnaire? Cela dit, le code dans ma réponse gère tous vos cas (implémentant IDictonary, fournissant des cas de bijection et de gestion où TKey == TValue). –
Si vous voulez la bijection à TKey == TValue', vous pouvez utiliser 'SelfBijectiveDictionary: BijectiveDictionary {...}' et en remplaçant sa méthode 'Add' et en vérifiant d'abord' if (base.Contains (key) | | this.Reversed.Contains (value)) lancer ... '. Les classes devraient être nommées différemment de toute façon, parce que l'une est bijective 'X-> Y' et l'autre' S-> S' (bijective à elle-même). –
Souligner la différence entre 'X-> Y' et' S-> S' aide beaucoup. Désolé pour le mal-entendu! Et oui - je fais deux dictionnaires nommés séparément pour eux. Merci de votre aide. – dlras2