Как получить словарь <строка, список <Object>с LINQ? - PullRequest
1 голос
/ 23 сентября 2010

У меня есть объект, который выглядит так:

class Model
{
   public string Category {get;set;}
   public string Description {get;set;}
}

В настоящее время я получаю весь список этих объектов с помощью Linq, а затем вручную настраиваю словарь, например:

   List<Model> models = //get list from repository and then with linq order them by category and description

Dictionary<string, List<Model>> dict= new Dictionary<string, List<Model>>();

            foreach (var m in models)            {
                if (dict.ContainsKey(m.Category))
                {
                    dict[m.Category].Add(m);
                }
                else
                {
                    dict.Add(m.Category, new List<Model> { m });
                }    
            }

таким образом, я могу получить доступ ко всем моделям определенной категории с помощью клавиш.

Есть ли способ генерировать словарь напрямую с помощью запроса LINQ?

Спасибо!

Ответы [ 3 ]

6 голосов
/ 23 сентября 2010

Вы видели класс Lookup?( msdn )

Вы можете создать его с помощью вызова метода Enumerable.ToLookup () ( msdn )

Это в основном то, чтохочу здесь, и обрабатывает двойные ключи.

5 голосов
/ 23 сентября 2010

Да, есть способ, но для этого вам нужно сначала сгруппировать их (чтобы избежать дублирования ключей):

var dict = (from model in models
            group model by model.Category into g
            select g).ToDictionary(x => x.Key, x => x.ToList());

(Пока вы занимаетесь этим, мне интересно, какова производительность этого и способа .ContainsKey ())

0 голосов
/ 23 сентября 2010

Вы можете использовать Aggregate (), чтобы скрыть логику foreach, но в качестве ОП, которому я в последний раз предлагал сказать, это цикл в одежде Linq.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...