Лучший способ использовать список < T > в коллекции Ключ / Значение?
-
03-07-2019 - |
Вопрос
Как лучше всего сохранить объект коллекции (например, список) в ситуации ключ / значение, где ключ - это идентификатор, а значение - это коллекция типа T?
Это единственный вариант или есть лучшее решение / другая коллекция для этого в .NET 3.5?
var x = new Dictionary<int, List<type>>();
Решение
Это хорошее решение, и оно будет работать достаточно хорошо - вы эффективно используете объект словаря {key = int, value = 4-байтовая ссылка}.
Когда вы извлекаете значение по ключу, вы возвращаете ссылку на List < T >
в куче и можете использовать его. Это будет очень эффективное и компактное решение вашей очевидной проблемы.
Другие советы
Я понятия не имею, если это то, что вам нужно, но я попробую.
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>();
}
Я не уверен, поможет ли это вам или нет, но может помочь вам перефразировать ваш вопрос.
ПРИМЕЧАНИЕ. Вышеприведенный код является воздушным кодом и не проверен.
Я не думаю, что внутри фреймворка есть что-то, но я думаю, что в библиотеке PowerCollections есть коллекция MultiDictionary. Вы можете попробовать это.
Я думаю, что вы, вероятно, должны написать свой класс-обертку в соответствии с вашими потребностями. Я имею в виду, что если вам нужно сохранить словарь предварительно составленных списков, то 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;
}
}
}
Очевидно, что ваши потребности могут быть другими, вам может понадобиться реализовать пару интерфейсов и т. д., но это общая идея.
Если ваш идентификатор относится к вашему типу, вы можете рассмотреть возможность реализации System.Collections.ObjectModel.KeyedCollection < TKey, TItem >
Вы ищете многозначный словарь, то есть набор ключей, где каждый ключ может иметь несколько значений? PowerCollections имеет такой MultiDictionary.