[英]Group by and Count on List
我有一个模型类的列表,其中有一些字段,我想按组应用,并以ID为基础,首先,我有这样的数据
lst[0]=Id=10,Name="user1",Gender="Male",Course="course1";
lst[1]=Id=10,Name="user1",Gender="Male",Course="course2";
lst[2]=Id=10,Name="user1",Gender="Male",Course="course3";
lst[3]=Id=11,Name="user2",Gender="Male",Course="course4";
我想按ID分组计算课程。 我就是这样
var result = lst.GroupBy(n => n.Id).Select(c => new { Key = c.Key, total = c.Count()});
但是应用此方法后,结果变量中没有任何值(即result.Name或result [0] .Name),如何应用分组依据并计入此列表中,因此也可以在应用分组依据后获得列表数据。
使用GroupBy
您已经将( Select(..)
)投影到一个匿名对象上,该对象将丢弃该组中的所选项目。 您的结果将是具有属性Key
和total
的项的IEnumerable<anonymous>
var result = lst.GroupBy(n => n.Id)
.Select(c => new { Key = c.Key, total = c.Count()});
如果要保留选定的项目,则需要将其包括在投影中
var result = lst.GroupBy(n => n.Id)
.Select(c => new { Key = c.Key, total = c.Count(), Items = c});
foreach(var r in result)
{
Console.WriteLine("Key: {0} Count:{1}",r.Key,r.total)
foreach(var i in r.Items)
Console.WriteLine(i.Name);
}
原因是因为您要按Id
分组,而只是使用Key
(即Id
)和Count
来提供匿名对象。 如果要读取值,则结果组集中的每个项目都将具有“计数”和可以在它们之间循环的值。 样品:
var result = lst.GroupBy(n => n.Id);
foreach (var g in result)
{
Console.WriteLine("For group {0} the total is {1}.", g.Key, g.Count());
foreach(var item in g)
{
Console.WriteLine("Name: {0}", item.Name);
}
}
您所要做的就是调用ToList
或ToArray
。
var result = lst.GroupBy(n => n.Id)
.Select(c => new
{
Key = c.Key,
total = c.Count(),
Gender = c.First().Gender
}).ToList();
或交替使用-避免同一枚举的多次迭代:
var result = lst.GroupBy(n => n.Id)
.Select(c =>
{
var firstEl = c.First();
return new {
Key = c.Key,
total = c.Count(),
Gender = firstEl.Gender,
Name = firstEl.Name,
Course = firstEl.Course
}
}).ToList();
Select
将仅返回延迟执行的查询。 这意味着您在实际迭代枚举时会得到结果,这是通过调用上述方法之一实现的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.