处理 LINQ 组的方法

本文关键字:方法 LINQ 处理 | 更新日期: 2023-09-27 18:30:49

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

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 内联工作。有什么建议吗?

处理 LINQ 组的方法

在我看来,您只需要更改参数的类型:

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

在 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)
*/