C# linq群的处理方法

C# linq群的处理方法,c#,linq,C#,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)

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

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

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

private void PrintGroups(IEnumerable<IGrouping<int, int>> groups, string title)
private void打印组(IEnumerable组,字符串标题)
然而,你不是真的对钥匙和计数感兴趣吗?毕竟,组中的所有值都是相同的

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();
}
private void打印组(IEnumerable组)
{
StringBuilder=新的StringBuilder();
foreach(组中的var组)
{
AppendFormat(“组{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)

*/
var nums=newlist(){1,1,5,6,1,5,2};
nums.GroupBy(n=>n)
.Select(n=>string.Format(“找到{1}次({2})的数字{0})”,n.Key,n.Count(),string.Join(“,”,n)))
托利斯先生()
.ForEach(strN=>Console.WriteLine(strN));
/*输出
数字1被发现3次(1,1,1)
数字5被发现2次(5,5)
数字6被发现1次(6)
数字2被发现1次(2)
*/

@Ek0nomik:不,这只是一个上下文关键字。哎哟!真不敢相信我没发现。不管怎样,我都要改变它。谢谢。是的,钥匙和计数会更好。只是试着学习/教LINQ慢慢地认识到一些事情…谢谢