Pergunta

Qual é a melhor maneira de manter uma coleção a objetos (Lista no exemplo) em uma situação de chave / valor, onde a chave é um ID eo valor é uma coleção de um tipo T?

Esta é a única opção ou há uma solução melhor / outra coleção para isso em .NET 3.5?

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

Solução

Esta é uma solução boa e vai funcionar muito bem -. Você está efetivamente usando um objeto de dicionário de {key = int, value = 4 referência byte}

Quando você recupera um valor pela chave você vai voltar a referência ao List<T> na pilha e ser capaz de usá-lo. Esta será uma solução muito eficiente e compacto para o seu problema aparente.

Outras dicas

Eu não tenho idéia se é isso que você precisa, mas eu vou ter pique para ele.

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

que você pode então chamar

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

Eu não tenho certeza se isso vai ajudá-lo ou não, mas ele pode ajudá-lo a reformular a sua pergunta.

NOTA:. A descrição acima é o código do ar e não foi testado

Eu não acho que haja nada no quadro, mas acho que há uma coleção MultiDictionary na biblioteca PowerCollections. Você poderia tentar isso.

Eu acho que você provavelmente deve escrever o seu classe de invólucro de acordo com suas necessidades. Quer dizer, se você precisa armazenar um dicionário de listas pré-fabricados, Dictionary<int, List<type>> deve ser muito bem contanto que é apenas uma propriedade privada. Você não deve expor-lo embora publicamente como, obviamente, ele expõe muita informação e você não pode lançá-lo aos IDictionary<int, IList<T>> ou algo semelhante por causa da falta de covariância.

Sua melhor aposta seria algo assim:

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, suas necessidades podem ser diferentes, pode ser necessário para implementar um par de interfaces, etc, mas esta é a ideia geral.

Se o seu ID é membro de seu tipo, você pode considerar a implementação de um System.Collections.ObjectModel.KeyedCollection<TKey, TItem>

Você está procurando um dicionário de valores múltiplos, ou seja, uma coleção com chave, onde cada tecla pode ter vários valores? PowerCollections tem tal MultiDictionary.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top