Sto scrivendo un bijective dictionary class, ma voglio assicurarmi che i due tipi generici non siano dello stesso tipo per due motivi.Utilizzo di dove specificare diversi generici
In primo luogo, vorrei che per implementare l'interfaccia IDictionary
in entrambe le direzioni, ma
public class BijectiveDictionary<TKey, TValue>
: IDictionary<TKey, TValue>, IDictionary<TValue, TKey>
mi dà " 'BijectiveDictionary < TKey, TValue >' non può implementare sia 'IDictionary < TKey, TValue >' e 'IDictionary < TValue, TKey >' perché possono unificare per alcune sostituzioni dei parametri di tipo "(che è comprensibile, ma non desiderabile.)
In secondo luogo, vorrei scrivere un opt soluzione imitata se entrambi i tipi sono uguali.
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
}
È possibile?
In caso contrario, posso considerare la mancata attuazione IDictionary
, ma non ho potuto garantire TValue this[TKey key]
e TKey this[TValue key]
sarebbero diverse, il che sarebbe un peccato.
Sembra che il problema qui sia che quando i due tipi sono uguali, si presentano i casi speciali.
Il mio intento originale era quello di creare un dizionario che mappa esattamente una chiave per esattamente un valore, e viceversa, tale che per ogni KeyValuePair<TKey, TValue>(X, Y)
, un KeyValuePair<TValue, TKey>(Y, X)
esiste pure.
Quando TKey
= TValue
, allora questo può essere semplificata fino a un singolo dizionario:
public T this[T key]
{
get { return this[key]; }
set
{
base.Add(key, value);
base.Add(value, key);
}
}
In questo caso, non è possibile Add(2,3); Add(3,4)
perché Add(2,3)
mappe 3
-2
pure, e [3]
sarebbe tornato 2
.
Tuttavia, Jaroslav Jandek's solution proposto utilizzando un secondo dizionario per fare ciò per i casi in cui TKey
! = TValue
. E anche se questo funziona meravigliosamente per questi casi, alla fine non segue il mio intento originario quando TKey
= TValue
, consentendo a Add(2,3); Add(3,4)
di mappare una singola chiave 3
a due valori (2
in una direzione, e 4
nell'altra), anche se credo che in senso stretto sia ancora una funzione biettiva valida.
Che cosa stai usando il dizionario per? Hai anche bisogno della parte di suriezione del tuo dizionario? Detto questo, il codice nella mia risposta gestisce tutti i tuoi casi (implementando IDictonary, fornendo bijection e gestendo casi in cui TKey == TValue). –
Se si desidera la bijection per 'TKey == TValue', è possibile utilizzare' SelfBijectiveDictionary: BijectiveDictionary {...} 'e sovrascrivere il suo metodo' Add' e controllare prima 'if (base.Contains (chiave) | | this.Reversed.Contains (value)) throw ... '. Le classi dovrebbero essere nominate diversamente in ogni caso, perché una è bijective 'X-> Y' e l'altra' S-> S' (biiettiva a se stessa). –
Indicare la differenza tra 'X-> Y' e' S-> S' aiuta molto. Ci scusiamo per tutta la confusione! E sì - sto facendo due dizionari separati per loro. Grazie per l'aiuto. – dlras2