Linq,IQueryable获取最频繁的元素对象



我的主要问题在于理解IGrouping<int, SubForm>。我想要最频繁的对象(MyClass)。这是我现在的代码:

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

这将返回IGrouping<int, SubForm>。要获得实际的对象,我必须执行另一个FirstOrDefault(),但编译器显示可能存在null异常。这是获得实际子表单的代码,它能做得更好吗?

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

您可以检查以确保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;

我想你想要:

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

您可以使用First。如果什么都没找到,它会抛出一个异常。

var subForm = classes.GroupBy(c => c.SubFormId)
    .OrderByDescending(sf => sf.Count())
    .FirstOrDefault();
return subForm == null ? default(SubForm) : subForm.Select(s => s.SubForm);

您缺少一个选择:

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

最新更新