2012-01-30 3 views
0

Моя основная проблема заключается в понимании IGrouping<int, SubForm>. Мне нужен самый частый объект (MyClass). Это код, у меня сейчас:Linq, IQueryable получить наиболее часто используемый объект элемента

var subForm = 
      classes.GroupBy(c => c.SubFormId) 
      .OrderByDescending(sf => sf.Count()) 
      .FirstOrDefault(); 

Это возвращает IGrouping<int, SubForm>. Чтобы получить фактический объект, я должен сделать еще один FirstOrDefault(), но компилятор показывает, что может быть пустое исключение. Это код для получения фактической подформы, можно ли это сделать лучше?

var subForm = 
      classes.GroupBy(c => c.SubFormId) 
      .OrderByDescending(sf => sf.Count()) 
      .FirstOrDefault().FirstOrDefault().SubForm; 
+1

Где MyClass бывают? Не совсем понятно, чего вы пытаетесь достичь ... –

+0

@JonSkeet, извините, это то же, что и класс SubForm. –

+0

Итак, вы пытаетесь получить идентификатор * ID или его сущность? –

ответ

1

Вы можете просто проверить, чтобы убедиться, что есть по крайней мере один пункт в вашем classes коллекции (так он гарантированно есть по крайней мере одна группа) либо в конце или в начале:

if(classes.Any()) 
{ 
    var subForm = classes.GroupBy(c => c.SubFormId) 
         .OrderByDescending(sf => sf.Count()) 
         .First().First().SubForm; 

} 

Или:

var topGroup = classes.GroupBy(c => c.SubFormId) 
         .OrderByDescending(sf => sf.Count()) 
         .FirstOrDefault(); 

if(topGroup!=null) 
    subForm = item.First().SubForm; 
+0

Так что я определенно нуждаюсь в нулевой проверке –

+0

Я бы выбрал первый вариант - просто убедитесь, что в 'classes' есть хотя бы один элемент - тогда остальное всегда будет работать. – BrokenGlass

0

Вы могли бы просто использовать First. Это исключало бы исключение, если ничего не найдено.

0
var subForm = classes.GroupBy(c => c.SubFormId) 
    .OrderByDescending(sf => sf.Count()) 
    .FirstOrDefault(); 

return subForm == null ? default(SubForm) : subForm.Select(s => s.SubForm); 
0

Вы пропускаете выберите:

var subForm = (
    from c in classes 
    group c by c.SubFormId into g 
    select g.Key) 
    .FirstOrDefault(); 
1

Я думаю, что вы хотите:

var sfGroup = classes.GroupBy(c => c.SubFormId) 
      .OrderByDescending(sf => sf.Count())     
      .FirstOrDefault(); 

    int count = sfGroup.Count(); 
    MyClass subForm = sfGroup.FirstOrDefault(); 
Смежные вопросы