IEnumerable <T>в IDictionary - PullRequest
       55

IEnumerable <T>в IDictionary

3 голосов
/ 28 февраля 2011

Какой самый эффективный способ конвертировать IEnumerable<T> в IDictionary<U, IEnumerable<T>>

Где U, например, Guid, для которого информация хранится в свойстве T.

По сути, это создает словарь списков, в котором все элементы в исходном списке сгруппированы на основе значения в свойстве объектов.

Пример

Определение объекта:

class myObject
{
    public Guid UID { get; set; }

    // other properties
}

Начать с:

IEnumerable<myObject> listOfObj;

Конец:

IDictionary<Guid, IEnumerable<myObject>> dictOfLists;

При этом listOfObj содержит объекты, которые имеют много разных, но иногда перекрывающихся значений для свойства UID.

Ответы [ 4 ]

5 голосов
/ 28 февраля 2011

Использование LINQ:

var dict = input.GroupBy(elem => elem.Identifier)
                .ToDictionary(grouping => grouping.Key, grouping => grouping.Select(x => x));
2 голосов
/ 01 марта 2011

ILookup<U,T> как «набор ключей, сопоставленных одному или нескольким значениям» не идентичен IDictionary<U, IEnumerable<T>>, но он эквивалентен, а в некоторых отношениях лучше. Это, безусловно, легко создать:

var myLookup = listOfObj.ToLookup(x => x.UID);
2 голосов
/ 28 февраля 2011

самый эффективный способ конвертации определенно пишет реализацию интерфейса IDictionary<U, IEnumerable<T>>, которая принимает IEnumerable<T> в конструкторе и реализует все операции на лету используя поиск в заданном IEnumerable<T>. Таким образом, само преобразование равно O (1).

Однако такая реализация будет иметь плохую производительность (но это не связано с эффективностью преобразования).

0 голосов
/ 28 февраля 2011

Я думаю, вы можете захотеть что-то вроде:

var dictionary = list.GroupBy(i => i.Guid,
                              (guid, i) => new { Key = guid, i })
                     .ToDictionary(i => i.Key, i => i);

Это сгруппировало бы исходный список по общим Guids и затем дало бы вам словарь с этим Guid в качестве ключа.

...