generic - new dictionary c#
C#- Necesita una implementación IDictionary que permita una clave nula (5)
Básicamente, quiero algo como esto:
Dictionary<object, string> dict = new Dictionary<object, string>();
dict.Add(null, "Nothing");
dict.Add(1, "One");
¿Hay alguna biblioteca integrada en la clase base que lo permita? El código anterior lanzará una excepción en el tiempo de ejecución al agregar la clave nula.
Gracias
¿La clave literalmente debe ser NULL? La clave en la colección funciona como un índice. No tiene mucho sentido para mí tener NULL para un índice en una colección.
Tal vez crear una nueva clase
public class ObjectEntry
{
public object objRef;
public string desc;
public ObjectEntry(object objectReference)
{
objRef = objectReference;
if (objRef = null) {desc = "Nothing";}
else {desc = objRef.Description;} //or whatever info you can get from a proper objRef value
}
}
newObj = new ObjectEntry(null);
dict.add(newObj, newObj.desc);
¿Qué tal esto?
public class NullableDictionnary<T1, T2> : Dictionary<T1, T2>
{
T2 null_value;
public T2 this[T1 key]
{
get
{
if (key == null)
{ return null_value; }
return base[key];
}
set
{
if (key == null)
{ null_value = value; }
else
{ base[key] = value; }
}
}
}
NameValueCollection puede tomar una clave nula pero no implementa IDictionary. Sin embargo, sería bastante fácil derivar de DictionaryBase y proporcionar Add / Remove / Indexers, etc. que simplemente reemplace null con algo incorporado como:
class MyDictionary : DictionaryBase {
private readonly object nullKey = new object();
void Add(object key, string value) {
if ( key == null ) { key = nullKey; }
.. call base methods
}
}
No hay necesidad de una implementación diferente de Dicionary.
Mire mi respuesta aquí: https://.com/a/22261282/212272
También podrá mantener su diccionario fuertemente tipado:
var dict = new Dictionary<NullObject<int?>, string>();
dict[1] = "one int";
dict[null] = "null int";
Assert.AreEqual("one int", dict[1]);
Assert.AreEqual("null int", dict[null]);
Podría evitar el uso de null y crear una clase especial de valor singleton que haga lo mismo. Por ejemplo:
public sealed class Nothing
{
public static readonly Nothing Value = new Nothing();
private Nothing() {}
}
Dictionary<object, string> dict = new Dictionary<object, string>();
dict.add(Nothing.Value, "Nothing");
dict.add(1, "One");
Este enfoque no funcionará si tiene la intención de hacer que su colección se escriba con mayor fuerza; digamos, por ejemplo, que desea que la clave sea una cadena. Como la cadena está sellada, no puede heredar de ella para crear un sustituto de "valor especial" para nulo. Tus alternativas se vuelven un poco más complicadas. Tú podrías:
- Cree un valor de constante especial para representar el caso "vacío" / "nulo". Tipo de hacky y definitivamente un camino a la confusión. Este puede ser un enfoque viable si el diccionario es completamente privado para alguna clase de implementación y puede escribir algunos métodos de utilidad Encode / Decode para evitar difundir el conocimiento de cómo se traducen las claves en cualquier lugar.
- Cree su propia implementación de IDictionary que delegue internamente en una instancia de <> diccionario, excepto en el caso de null. Esto viola las expectativas documentadas para la interfaz IDictionary <> que dice que las claves nulas deben arrojar una excepción. Pero puede salirse con la suya si es la única forma de resolver su problema real. Esto solo funciona si posee y crea la instancia del diccionario.
- Encuentre una manera de resolver su problema sin almacenar una clave "nula" en el diccionario. Por ejemplo, considere no completar la clave nula en el diccionario y tener alguna lógica de caso especial para manejarla. Las claves deben ser fáciles de usar y comparables para funcionar con la implementación subyacente, por lo que null está prohibido normalmente.
Como un aparte, ¿su clave de diccionario realmente necesita la clave para ser object
? Esto puede conducir a errores sutiles debido a que se utiliza la igualdad de referencia en la que puede haber previsto que Equals () se evalúe como base para la comparación.