LINQ - преобразовать список в словарь со значением в виде списка

99

у меня есть

List<MyObject> 

что я извлекаю из базы данных. Однако я хотел бы, чтобы он был привязан к свойству в MyObject для целей группировки. Как лучше всего с LINQ преобразовать мой список в:

Dictionary<long, List<MyObject>>

Имею следующее:

myObjectList.ToDictionary(x => x.KeyedProperty)

Но возвращается:

Dictionary<long, MyObject>
Брэндон
источник
Вы хотите, чтобы словарь был привязан к свойству WHICH MyObject? - у вас есть их целый список ....
Джеймс Карран

Ответы:

192

Похоже, вы хотите сгруппировать MyObjectэкземпляры KeyedPropertyи поместить эту группу в файл Dictionary<long,List<MyObject>>. Если да, то попробуйте следующее

List<MyObject> list = ...;
var map = list
  .GroupBy(x => x.KeyedProperty)
  .ToDictionary(x => x.Key, x => x.ToList());
ДжаредПар
источник
16

Вы должны использовать ToLookupметод расширения в Enumerableклассе следующим образом:

List<MyObject> list = ...;

ILookup<long, MyObject> lookup = list.ToLookup(o => o.KeyedProperty);

Если вы хотите поместить это в словарь, вы можете использовать ToDictionaryметод расширения , например:

IDictionary<long, IEnumerable<MyObject>> dictionary = lookup.ToDictionary(
    l => l.Key);
casperOne
источник
В чем разница между этим и принятым ответом? Сохраняются ли ILookupссылки, тогда как принятый ответ - нет?
PatPeter
@PatPeter Идея состоит в том, что когда у вас есть отношение «один ко многим» между ключом и элементами, структура Lookup<TKey, TValue>может быть лучше, чем структура Dictionary<TKey, TValue>.
casperOne
1
@PatPeter, я бы сказал, что ILookup - лучшая структура для использования (это как мульти-карта для карты словаря, если вы знаете алгоритмы сбора C ++), но у нее есть один важный фактор, который следует учитывать - созданный поиск неизменен. Вы не можете добавлять или удалять записи впоследствии.
gbjbaanb
Другое соображение заключается в том, что, хотя ILookupчасто это идеальная структура кода, она часто плохо обрабатывается для сериализации.
Jeff B,