Estoy escribiendo un bijective dictionary class, pero quiero asegurarme de que los dos tipos genéricos no son del mismo tipo por dos razones.Uso de dónde especificar diferentes genéricos
En primer lugar, me gustaría que implementa la interfaz IDictionary
en ambas direcciones, pero
public class BijectiveDictionary<TKey, TValue>
: IDictionary<TKey, TValue>, IDictionary<TValue, TKey>
me da " 'BijectiveDictionary < TKey, TValue >' no se puede aplicar tanto 'IDictionary < TKey, TValue >' y 'IDictionary < TValue, TKey >', ya que pueden unificar para algunas sustituciones de parámetros de tipo "(que es comprensible, pero indeseable.)
segundo lugar, me gustaría escribir un opt solución imitada si ambos tipos son iguales.
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
}
¿Esto es posible?
Si no, puedo considerar la no implementación de IDictionary
, pero no puedo garantizar que TValue this[TKey key]
y TKey this[TValue key]
sean diferentes, lo que sería desafortunado.
Parece que el problema aquí es que cuando los dos tipos son iguales, surgen los casos especiales.
Mi intención original era crear un diccionario que asigna exactamente una clave a exactamente un valor, y viceversa, de modo que para cada KeyValuePair<TKey, TValue>(X, Y)
, existe también un KeyValuePair<TValue, TKey>(Y, X)
.
Cuando TKey
= TValue
, entonces esto se puede simplificar a un solo diccionario:
public T this[T key]
{
get { return this[key]; }
set
{
base.Add(key, value);
base.Add(value, key);
}
}
En este caso, no se puede Add(2,3); Add(3,4)
porque Add(2,3)
mapas 3
a 2
también, y [3]
volvería 2
.
Sin embargo, Jaroslav Jandek's solution propuso utilizar un segundo diccionario para hacer esto para los casos cuando TKey
! = TValue
. Y aunque esto funciona maravillosamente para esos casos, (y lo que decidí implementar, al final) no sigue mi intención original cuando TKey
= TValue
, al permitir Add(2,3); Add(3,4)
asignar una sola clave 3
a dos valores (2
en una dirección, y 4
en la otra, aunque creo que estrictamente hablando sigue siendo una función biológica válida.
¿Qué estás usando el diccionario para? ¿Necesita siquiera la parte de su diccionario? Dicho esto, el código en mi respuesta maneja todos sus casos (implementando IDictonary, proporcionando bijection y manejando casos donde TKey == TValue). –
Si quiere bijection para sí mismo para 'TKey == TValue', podría usar' SelfBijectiveDictionary: BijectiveDictionary {...} 'y anular su método' Add' y verificar primero 'if (base.Contains (key) | | this.Reversed.Contains (value)) throw ... '. Las clases se deben nombrar de manera diferente de todos modos, porque uno es bijective 'X-> Y' y el otro' S-> S' (bijective a sí mismo). –
Señalar la diferencia entre 'X-> Y' y' S-> S' ayuda mucho. ¡Lo siento por toda la confusion! Y sí, estoy haciendo dos diccionarios nombrados por separado para ellos. Gracias por tu ayuda. – dlras2