Лучший способ использовать список < T > в коллекции Ключ / Значение?

StackOverflow https://stackoverflow.com/questions/416454

Вопрос

Как лучше всего сохранить объект коллекции (например, список) в ситуации ключ / значение, где ключ - это идентификатор, а значение - это коллекция типа 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top