LINQ Group в объект словаря

Я пытаюсь использовать LINQ для создания Dictionary<string, List<CustomObject>> из List<CustomObject>. Я могу заставить это работать с помощью "var", но я не хочу использовать анонимные типы. Вот что я

var x = (from CustomObject o in ListOfCustomObjects
      group o by o.PropertyName into t
      select t.ToList());

Я также попытался использовать Cast<>() из библиотеки LINQ после того, как у меня есть x, но у меня возникают проблемы с компиляцией, поскольку это недействительный листинг.

Ответ 1

Dictionary<string, List<CustomObject>> myDictionary = ListOfCustomObjects
    .GroupBy(o => o.PropertyName)
    .ToDictionary(g => g.Key, g => g.ToList());

Ответ 2

Я не могу комментировать @Майкл Блэкберн, но я думаю, что вы получили нижний предел, потому что в этом случае GroupBy не нужен.

Используйте его как:

var lookupOfCustomObjects = listOfCustomObjects.ToLookup(o=>o.PropertyName);
var listWithAllCustomObjectsWithPropertyName = lookupOfCustomObjects[propertyName]

Кроме того, я видел, как это работает лучше, чем при использовании GroupBy(). ToDictionary().

Ответ 3

Для @atari2600 это будет выглядеть так, как использовать ToLookup в синтаксисе лямбда:

var x = listOfCustomObjects
    .GroupBy(o => o.PropertyName)
    .ToLookup(customObject => customObject);`

В принципе, он принимает IGrouping и материализует его для вас в словарь списков со значениями PropertyName в качестве ключа.