分组依据并依靠列表

本文关键字:依靠 列表 | 更新日期: 2023-09-27 18:34:57

>我有一个模型类列表,里面有一些字段,我想应用分组依据并依靠它的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()});

但是在应用这个之后,我在结果变量(即结果(中没有得到任何值。名称或结果[0]。名称(我如何在此列表中应用分组依据和计数,以便在应用分组依据后获得列表数据。

分组依据并依靠列表

使用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的匿名对象。如果要读取这些值,结果组集的每个项都将具有 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只会返回延迟执行的查询。这意味着当您实际迭代枚举时,您会得到结果,这是通过调用上述方法之一来确认的。