2

我有一个简单的整数列表(重复一些值)并处理:

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 语句不能对 'object' 类型的变量进行操作,因为 'object' 不包含 'GetEnumerator' 的公共定义”

但是相同的代码与 linq 内联工作。有什么建议么?

4

2 回答 2

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();
}
于 2012-04-11T14:14:40.727 回答
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)

*/
于 2012-04-11T14:19:28.717 回答