繁体   English   中英

分组并计数

[英]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(..) )投影到一个匿名对象上,该对象将丢弃该组中的所选项目。 您的结果将是具有属性Keytotal的项的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);
    }
}

您所要做的就是调用ToListToArray

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM