Лучший способ использовать List <T>в коллекции Key / Value? - PullRequest
2 голосов
/ 06 января 2009

Каков наилучший способ сохранить объект коллекции (например, список) в ситуации ключ / значение, где ключом является идентификатор, а значением является коллекция типа T?

Это единственный вариант или есть лучшее решение / другая коллекция для этого в .NET 3.5?

var x = new Dictionary<int, List<type>>();

Ответы [ 6 ]

3 голосов
/ 06 января 2009

Это хорошее решение, и оно будет работать довольно хорошо - вы эффективно используете объект словаря {key = int, value = 4-байтовая ссылка}.

Когда вы получите значение по ключу, вы получите ссылку на List<T> в куче и сможете использовать ее. Это будет очень эффективное и компактное решение вашей очевидной проблемы.

0 голосов
/ 06 января 2009

Вы ищете многозначный словарь, то есть коллекцию ключей, где каждый ключ может иметь несколько значений? PowerCollections имеет такой MultiDictionary.

0 голосов
/ 06 января 2009

Если ваш идентификатор относится к вашему типу, вы можете рассмотреть возможность применения System.Collections.ObjectModel.KeyedCollection<TKey, TItem>

0 голосов
/ 06 января 2009

Я думаю, вы, вероятно, должны написать свой класс-обертку в соответствии с вашими потребностями. Я имею в виду, если вам нужно хранить словарь предварительно составленных списков, Dictionary<int, List<type>> должно подойти, если это только частная собственность. Вы не должны раскрывать это, хотя публично, поскольку очевидно, что оно предоставляет слишком много информации, и вы не можете привести ее к IDictionary<int, IList<T>> или чему-то подобному из-за отсутствия ковариации.

Ваша лучшая ставка была бы примерно такой:

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;
       }
    }
}

Очевидно, что ваши потребности могут быть другими, вам может понадобиться реализовать пару интерфейсов и т. Д., Но это общая идея.

0 голосов
/ 06 января 2009

Не думаю, что что-то есть в рамках, но я думаю, что в библиотеке PowerCollections есть коллекция MultiDictionary. Вы можете попробовать это.

0 голосов
/ 06 января 2009

Понятия не имею, если это то, что вам нужно, но я попробую это сделать.

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

, который можно затем назвать

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

Я не уверен, поможет ли это вам или нет, но может помочь вам перефразировать ваш вопрос.

ПРИМЕЧАНИЕ. Вышеприведенный код является воздушным кодом и не проверен.

...