我有类似
的课程public class user
{
public int ID { get; set; }
public int money { get; set; }
}
和数据类似
List<user> users = new List<user>();
user u1 = new user();
u1.ID = 1;
u1.money = 20;
users.Add(u1);
user u2 = new user();
u2.ID = 1;
u2.money = 30;
users.Add(u2);
user u3 = new user();
u3.ID = 2;
u3.money = 100;
users.Add(u3);
user u4 = new user();
u4.ID = 2;
u4.money = 200;
users.Add(u4);
user u5 = new user();
u5.ID = 3;
u5.money = 500;
users.Add(u5);
现在我想要一个用户列表,其中应包含3个基于唯一ID的用户,并且他们的Money应该是重复的平均值。
任何提示在正确的方向都会很棒。
由于
答案 0 :(得分:4)
如果我理解正确,这可以为您提供所需内容 - 按ID
对用户进行分组,然后计算money
的平均值:
var result = from u in users
group u by u.ID into g
select new { ID = g.Key, Average = g.Average (x => x.money) };
答案 1 :(得分:3)
使用Linq很容易,请尝试:
var q = from u in users
group u by u.ID into g
select new user { ID = g.Key, money = (int)g.Average(u => u.money) };
foreach (user u in q)
{
Console.WriteLine("{0}={1}", u.ID, u.money);
}
答案 2 :(得分:1)
users.GroupBy(x => x.ID).Select(g => new user() {ID = g.Key, money =(int) g.Average(x => x.money)});
答案 3 :(得分:1)
如果您不能或不想使用Linq,这是另一种解决方案。此外,看起来你想要一个其他海报似乎没有注意到的加权平均值。
向用户类添加权重字段,初始值为1.创建一个字典,其中用户ID为键,用户对象为值。迭代您的“用户”列表并: *检查字典是否已包含当前用户 *如果没有,添加用户:dict.Add(user.ID,user) *如果是,请将该用户的权重增加1:dict [user.ID] .weight ++
之后,您可以很容易地计算加权平均值。迭代dict.Values,并在每次迭代中将user.money * user.weight添加到sum变量。在foreach循环之后,将其除以唯一用户的数量:
double avg = sum / (double)dict.Count;
不要忘记将其中一个操作数强制转换为double,否则会将其解释为整数除法(余数将被忽略)。
对不完整的示例和格式不佳感到抱歉,但我正在手机上写这个。