具有重复的列表中的计算

时间:2011-10-06 04:50:59

标签: c# .net winforms duplicates generic-list

我有类似

的课程
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应该是重复的平均值。

任何提示在正确的方向都会很棒。

由于

4 个答案:

答案 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,否则会将其解释为整数除法(余数将被忽略)。

对不完整的示例和格式不佳感到抱歉,但我正在手机上写这个。