2013-07-22 4 views
0

Я пытаюсь сделать GroupBy, а затем OrderBy в список, который у меня есть. Вот мой код до сих пор:GroupBy и OrderBy

reportList.GroupBy(x => x.Type).ToDictionary(y=>y.Key, z=>z.OrderBy(a=>a.Lost)); 

С помощью последнего вопроса, я спросил о LINQ Я думаю, что ToDictionary, вероятно, не нужен, но без этого я не знаю, как получить доступ к внутренней стоимости.

Чтобы был ясен, мне нужно GroupBy в Type собственности и хочу внутренние группы, которые я получаю, чтобы быть OrderByLost свойства (целое число). Я хочу знать, есть ли лучший, более эффективный способ или, по крайней мере, лучше, чем то, что я сделал.

Объяснение, а не только ответ будет очень оценен.

+2

То, что вы написали, кажется, совершенно хорошо. Почему, по-вашему, вам не нужен словарь? –

+0

В вашем примере есть некоторые проблемы с '('. 'ReportList.GroupBy (x => x.Type) .ToDictionary (y => y.Key, z => z) .OrderBy (a => a.Lost);' –

ответ

1

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

reportList.GroupBy(r => r.Type) 
    .Select(g => new { Type = g.Key, Reports = g.OrderBy(r => r.Lost) }); 
3

Да, есть лучший подход. Не использовать случайные имена (х, у, г, а) для переменных:

reportList.GroupBy(r => r.Type) 
      .ToDictionary(g => g.Key, g => g.OrderBy(r => r.Lost)); 

Вы можете даже использовать длинные имена, чтобы сделать код более описательным (в зависимости от контекста, в котором вы создаете запрос)

reportList.GroupBy(report => report.Type) 
      .ToDictionary(group => group.Key, 
         group => group.OrderBy(report => report.Lost)); 
2

Ваш код делает в основном следующие вещи:

  1. элементы группы по типу
  2. Преобразовать GroupBy привести в словарь, где значения Dictionar y являются IEnumerables, поступающие от звонка в OrderBy

Что касается правильности кода, это вполне нормально ИМО, но, возможно, его можно улучшить с точки зрения эффективности (даже если это зависит от ваших потребностей).

На самом деле, с вашим кодом значения вашего словаря лениво оцениваются каждый раз, когда вы перечисляете их, в результате чего возникает вызов метода OrderBy.

Возможно, вы могли бы выполнить его один раз и сохранить результат таким образом:

var dict = reportList 
      .GroupBy(x => x.Type) 
      .ToDictionary(y => y.Key, z => z.OrderBy(a => a.Lost).ToList()); 
// note the ToList call 

или таким образом:

var dict = reportList.OrderBy(a => a.Lost) 
        .GroupBy(x => x.Type) 
        .ToDictionary(y => y.Key, z => z); 
// here we order then we group, 
// since GroupBy guarantees to preserve the original order 
+1

+1 для оптимизации 'ToList()', чтобы избежать перечислимой группы каждый раз. Кстати, это зависит от того, как будет использоваться словарь. Если отчеты будут доступны один раз для каждого типа или будут перечислены только несколько типов, то лучше не создавать список. –

+1

Правильно, вот в чем причина моего замечания в круглых скобках;) – digEmAll

Смежные вопросы