2012-01-30 42 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的進來嗎?這不是很清楚你想要實現什麼...... – 2012-01-30 14:16:01

+0

@JonSkeet,對不起,它與SubForm類相同。 – 2012-01-30 14:16:46

+0

那麼你想獲得它的* ID *,還是實際的實體? – 2012-01-30 14:18:48

回答

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

所以我肯定需要一個空檢查 – 2012-01-30 14:23:12

+0

我會去第一個選項 - 只要確保在類中至少有一個項目 - 然後其餘的將始終工作。 – BrokenGlass 2012-01-30 14:24:34

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();