0
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通过将组中每个成员的 s 相加individualcredit并除以组成员的数量来计算。

最后,我想为每个用户分配他们的groupCredit. 有三到五个成员的小组。

任何人都可以帮助我吗?至少给我一个样本解决的问题?我进行了搜索,但没有找到与此完全匹配的内容。

到目前为止,这是我的 linq

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

在这里我不明白要做的是获取组标记(它是计算添加所有组成员标记并将其除以组成员的数量)并将组标记分配给组中的每个成员。

4

3 回答 3

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;
于 2014-05-23T22:50:25.323 回答
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;
    }
}
于 2014-05-23T22:52:46.153 回答
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;
}
于 2014-05-23T22:48:35.643 回答