我有一个模型类的列表,其中包含一些字段,我想在其上应用group by并依靠ID的基础,在我的lst中我有这样的数据
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) 如何在此列表中应用分组和计数,以便在应用组之后获取列表数据。
答案 0 :(得分:2)
使用GroupBy
您已将(Select(..)
)投射到匿名对象,该对象会丢弃组中的所选项目;您的结果将是IEnumerable<anonymous>
项,其中包含属性Key
和total
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);
}
答案 1 :(得分:1)
原因是您按Id
进行分组,只是使用Key
(Id
)和Count
来提供匿名对象。如果要读取值,结果组集的每个项都将具有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);
}
}
答案 2 :(得分:0)
您所要做的就是致电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
只会返回deferredly executed的查询。这意味着当你实际迭代枚举时会得到结果,这是通过调用上面提到的方法之一来实现的。