对对象列表进行分组并将值分配给组

时间:2014-05-23 22:44:12

标签: c# list linq attributes linq-group

class user    
{
    public string userID { get; set; }
    public string groupID { get; set; }
    public int individualCredit { get; set; }
    public int groupCredit { get; set; }
}

我有一个像这样的列表

 List<user> listUsers = new List<user>();

我需要做以下事情,并且我已经完成了迄今为止我尝试过的事情。

我想将用户分组为groupID

通过添加组中每个成员的groupCredit并将其除以组成员数来计算individualcredit

最后,我想为每个用户分配groupCredit。 有三到五名成员的团体。

任何人都可以帮助我吗?至少给我一个示例解决的问题?我搜索了但是我找不到任何与之相匹配的东西。

到目前为止,这是我的linq

var groups = lstUsers.GroupBy(x => x.groupID).Select(g => new {ID=g.Key,count=g.Count() });

这里我不明白的事情是获取组标记(计算添加所有组成员标记并将其除以组成员数)并为每个成员分配组标记一个小组。

3 个答案:

答案 0 :(得分:1)

var groups = listUsers.GroupBy(x => x.groupID)
                .Select(g => new { ID = g.Key, AverageCredit = g.Average(u => u.individualCredit) });

foreach (var user in listUsers)
    user.groupCredit = groups.First(u => u.ID == user.groupID).AverageCredit;

答案 1 :(得分:0)

您在一个LINQ表达式中进行所有查询,然后在循环中设置所有内容。

var credits = lstUsers.GroupBy(x => x.groupID)
        .Select(g => {ID = g.Key, Credit = g.Sum(x => x.individualCredit)/g.Count()});

foreach (var user in lstUsers)
{
    user.groupCredit = credits.Single(x => x.ID == user.groupID).Credit;
}

答案 2 :(得分:0)

由于类是通过引用,您只需将其添加到匿名类型。然后你不必通过密钥重新查找

var listUsers = new List<user>();
var groups = listUsers.GroupBy(x => x.groupID).Select(g => new { users = g, groupCredit = g.Average(u => u.individualCredit) });
foreach (var group in groups)
{
    foreach (var member in group.users)
    {
        // Avg is a decimal have to cast back to int for class
        member.groupCredit = (int)group.groupCredit;
    }
}