处理 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 内联工作。有什么建议吗?
在我看来,您只需要更改参数的类型:
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)
*/