分组依据和列表

时间:2016-02-16 11:14:51

标签: c#

我有一个模型类的列表,其中包含一些字段,我想在其上应用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) 如何在此列表中应用分组和计数,以便在应用组之后获取列表数据。

3 个答案:

答案 0 :(得分:2)

使用GroupBy您已将(Select(..))投射到匿名对象,该对象会丢弃组中的所选项目;您的结果将是IEnumerable<anonymous>项,其中包含属性Keytotal

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进行分组,只是使用KeyId)和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)

您所要做的就是致电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只会返回deferredly executed的查询。这意味着当你实际迭代枚举时会得到结果,这是通过调用上面提到的方法之一来实现的。