Linq,IQueryable得到最频繁的元素对象

时间:2012-01-30 14:14:33

标签: c# linq entity-framework

我的主要问题在于理解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 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

我想你想要:

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

  int count = sfGroup.Count();
  MyClass subForm = sfGroup.FirstOrDefault();

答案 2 :(得分:0)

你可以使用First。如果找不到任何内容,它会抛出异常。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

您缺少一个选择:

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