Расчет в списке с дублированием - PullRequest
0 голосов
/ 06 октября 2011

У меня есть класс как

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 пользователя на основе уникального идентификатора и иих Деньги должны быть средними в соответствии с повторением.

Любой намек был бы полезен в правильном направлении.

Спасибо

Ответы [ 4 ]

4 голосов
/ 06 октября 2011

Если я вас правильно понимаю, это должно дать вам то, что вы хотите - сгруппируйте пользователей по 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) };
3 голосов
/ 06 октября 2011

Использовать 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);
        }
1 голос
/ 06 октября 2011

Если вы не можете или не хотите использовать Linq, вот другое решение.Кроме того, похоже, что вам нужно средневзвешенное значение, которое другие авторы, похоже, не заметили.

Добавьте поле Weight в класс пользователя с начальным значением 1. Создайте словарь с идентификаторами пользователя в качестве ключейи пользователь возражает как значения.Переберите свой список пользователей и: * проверьте, содержит ли словарь текущий пользователь *, если нет, добавьте пользователя: dict.Add (user.ID, user) *, если это так, увеличьте вес этогоuser by 1: dict [user.ID] .weight ++

После этого вы можете довольно легко вычислить средневзвешенное значение.Итерируйте по dict.Values ​​и добавляйте user.money * user.weight к переменной sum в каждой итерации.После цикла foreach разделите его на число уникальных пользователей:

double avg = sum / (double)dict.Count;

Не забудьте привести один из операндов к двойному, потому что в противном случае это будет интерпретироваться как целочисленное деление (остаток будетигнорируется).

Извините за неполный пример и плохое форматирование, но я пишу это на своем телефоне.

1 голос
/ 06 октября 2011
users.GroupBy(x => x.ID).Select(g => new user() {ID = g.Key, money =(int) g.Average(x => x.money)});
...