2012-04-11 85 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