Linq, IQueryable получает наиболее частый элемент - PullRequest
0 голосов
/ 30 января 2012

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

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;

Ответы [ 5 ]

1 голос
/ 30 января 2012

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

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

  int count = sfGroup.Count();
  MyClass subForm = sfGroup.FirstOrDefault();
1 голос
/ 30 января 2012

Вы можете просто убедиться, что в вашей коллекции 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 голосов
/ 30 января 2012

Вам не хватает выбора:

var subForm = (
    from c in classes
    group c by c.SubFormId into g
    select g.Key)
    .FirstOrDefault();
0 голосов
/ 30 января 2012
var subForm = classes.GroupBy(c => c.SubFormId)
    .OrderByDescending(sf => sf.Count())
    .FirstOrDefault();

return subForm == null ? default(SubForm) : subForm.Select(s => s.SubForm);
0 голосов
/ 30 января 2012

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

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