2012-04-11 75 views
2

我有整數的簡單列表(一些值重複),並與過程:方法來處理LINQ組

var groups = from n in numbers 
    group n by n into numGroup 
    where numGroup.Count()>1 
    select numGroup; 

我可以在與LINQ後直接嵌套循環組迭代,但我有麻煩編寫一個單獨的方法來遍歷它們。這是我嘗試過的。

private void PrintGroups(IEnumerable groups, string title) 
{ 
    int i = 0; 
    foreach (var group in groups) 
    { 
     txt1.Text += "Group " + ++i + "\r\n"; ; 
     foreach (var x in group) 
       txt1.Text += " " + x.ToString() + "\r\n"; ; 
    } 
} 

編譯器不喜歡內的foreach:

「foreach語句無法在類型‘對象’的變量操作,因爲‘對象’不包含‘的GetEnumerator’一個公共定義」

但是相同的代碼與linq內聯工作。有什麼建議麼?

+1

@ Ek0nomik:不,它只是一個上下文關鍵字。 – 2012-04-11 14:14:06

+0

哎!不能相信我沒有發現。無論如何我都在改變它。謝謝。 – drg 2012-04-12 12:51:51

回答

5

它看起來對我來說,你只需要改變你的參數類型:

private void PrintGroups(IEnumerable<IGrouping<int, int>> groups, string title) 

但是,是不是你真正的關鍵和計數只是有興趣?畢竟,組中的所有值將是相同的...

private void PrintGroups(IEnumerable<IGrouping<int, int>> groups) 
{ 
    StringBuilder builder = new StringBuilder(); 
    foreach (var group in groups) 
    { 
     builder.AppendFormat("Group {0}: {1}\r\n", group.Key, group.Count()); 
    } 
    txt1.Text = builder.ToString(); 
} 
+0

是的,關鍵和數量會更好。只是試圖學習/教LINQ如此慢慢實現的東西......謝謝 – drg 2012-04-12 12:56:35

0

在LINQ之一的預測認爲,這裏是我的項目組數字爲可顯示的字符串的例子用戶。

var nums = new List<int>() { 1, 1, 5, 6, 1, 5, 2 }; 

nums.GroupBy (n => n) 
    .Select (n => string.Format("Number {0} is found {1} times ({2})", n.Key, n.Count(), string.Join(",", n))) 
    .ToList() 
    .ForEach(strN => Console.WriteLine (strN)); 

/* Output 

Number 1 is found 3 times (1,1,1) 
Number 5 is found 2 times (5,5) 
Number 6 is found 1 times (6) 
Number 2 is found 1 times (2) 

*/ 
+0

另一個例子來學習!謝謝。 – drg 2012-04-12 12:57:09