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() });
这里我不明白的事情是获取组标记(计算添加所有组成员标记并将其除以组成员数)并为每个成员分配组标记一个小组。
答案 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;
}
}