Pregunta

¿Cuál es la mejor manera de mantener un objeto de colección (Lista en el ejemplo) en una situación de Clave / Valor, donde la clave es una ID y el valor es una colección de un tipo T?

¿Es esta la única opción o hay una mejor solución / otra colección para esto en .NET 3.5?

var x = new Dictionary<int, List<type>>();
¿Fue útil?

Solución

Esta es una buena solución y funcionará bastante bien. Está utilizando efectivamente un objeto de diccionario de {clave = int, valor = referencia de 4 bytes}.

Cuando recupere un valor por la clave, volverá a la referencia a la Lista < T > en el montón y podrá usarlo. Esta será una solución muy eficiente y compacta para su problema aparente.

Otros consejos

No tengo idea de si esto es lo que necesitas, pero tendré que cortarlo.

public Dictionary<int,List<T>> myFunction<T>()
{
    var returnvalue = new Dictionary<int,List<T>>();
    //Do some stuff with the collection.
    return returnvalue;
}

a la que puedes llamar

public void Main()
{
  var functionreturn = myFunction<String>();
}

No estoy seguro de si esto te ayudará o no, pero puede ayudarte a volver a redactar tu pregunta.

NOTA: Lo anterior es un código de aire y no está probado.

No creo que haya nada dentro del marco, pero creo que hay una colección MultiDictionary en la biblioteca de PowerCollections. Puedes intentarlo.

Creo que probablemente deberías escribir tu envoltura de acuerdo con tus necesidades. Quiero decir, si necesita almacenar un diccionario de listas prefabricadas, Dictionary < int, List < type > > debería estar bien siempre que sea solo una propiedad privada. No debe exponerlo públicamente, ya que obviamente expone demasiada información y no puede convertirlo en IDictionary < int, IList < T > > o algo similar debido a la falta de covarianza.

Tu mejor apuesta sería algo así:

class MyWrapper<T>()
{
    private Dictionary<int, List<T>> dictionary { get; set; }
    public MyWrapper() { dictionary = new Dictionary<int, List<T>>(); }

    // Adds a new item to the collection
    public void Add(int key, T item)
    {
       List<T> list = null;
       if (!dictionary.TryGetValue(key, out list))
       {
          // If dictionary does not contain the key, we need to create a new list
          list = new List<T>();
          dictionary.Add(key, list);
       }
       list.Add(item);
    }

    public IEnumerable<T> this[int key]     
    {
       get
       {
           List<T> list = null;
           // We just return an empty list if the key is not found
           if (!dictionary.TryGetValue(key, out list)) return new List<T>();
           else return list;
       }
    }
}

Obviamente, sus necesidades pueden ser diferentes, puede que necesite implementar un par de interfaces, etc., pero esta es la idea general.

Si su ID es un miembro de su tipo, podría considerar la implementación de un System.Collections.ObjectModel.KeyedCollection < TKey, TItem >

¿Está buscando un diccionario de múltiples valores, es decir, una colección con clave, donde cada clave puede tener múltiples valores? PowerCollections tiene un MultiDiccionario así.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top