Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2022, 23:57   #1
Farlep
Пользователь
 
Регистрация: 01.01.2021
Сообщений: 30
По умолчанию List<T> и GroupBy

Добрый день

Есть List<User> Users { get; set; };

В нем идут дубликаты номеров телефона

Использую поиск по мобильному номеру и формирую новый список без дублей.

Users = Users.GroupBy(x => x.CalledNumber).Select(x => x.First()).ToList();

Но задача стоит более сложная, как для меня

Нужно перед тем как убрать дубль из файла, просуммировать поля объекта

01.12.2021 11:30:22 +38067*** Входящий звонок 608 10 11
01.12.2021 11:48:40 +38067*** Входящий звонок 162 15 5

//длительность вызова/кол-во м.б
public int CallDuration { get; set; }
//стоимость вызова
public double CallCostWithTaxes { get; set; }
//стоимость вызова с учетом скидки
public double CallCostWithDiscount { get; set; }

На выходе нужно получить один номер, но с просуммированными полями с удаленных дублей.
Farlep вне форума Ответить с цитированием
Старый 30.03.2022, 15:12   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

использовать такую перегрузку метода:
Код:
Users = Users.GroupBy(x => x.CalledNumber, (num, gr) =>
{
  return new User ...
}).ToList()
для каждой группы в итоге вызовется указанный делегат и на вход в num попадёт CalledNumber как ключ группы, а в gr - коллекция элементов этой группы, т.е. все User с данным CallerNumber. Вот на основе этих данных можно создать новый User или объект любого нужного типа и заполнить нужными данными.
pu4koff вне форума Ответить с цитированием
Старый 30.03.2022, 19:05   #3
Farlep
Пользователь
 
Регистрация: 01.01.2021
Сообщений: 30
По умолчанию

pu4koff, спасибо за предложение но я так и не осилил ваш запрос.

Пошел другим путем, через SortedDictionary. Если ключ в словаре (номер телефона) то перебирая свой лист суммирую нужные поля. Да и сортировка есть уже, не пришлось реализовывать самостоятельно интерфейс для класса юзеров IEnumerable и IEnumerator.
Farlep вне форума Ответить с цитированием
Старый 30.03.2022, 20:20   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

С GroupBy по сути то же самое получается, просто запись короче.
Код:
Users = Users.GroupBy(x => x.CalledNumber, (num, gr) =>
{
  var user = new User(); // создаём новый объект, который вернём вместо группы
  user.CalledNumber = num; // указываем номер
  // в свойства прописываем суммы значений из всей группы объектов User
  user.CallDuration = gr.Sum(u => u.CallDuration);
  user.CallCostWithTaxes = gr.Sum(u => u.CallCostWithTaxes);
  user.CallCostWithDiscount = gr.Sum(u => u.CallCostWithDiscount);
  return user; // возвращаем новый объект, заполненный суммарными значениями
}).ToList()
ну, можно там ещё наверно проверку добавить, если в gr один элемент, то его же и возвращать, не выполняя лишнюю работу.
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C# - Как изменить свойство элемента в list? List<MyClass> kvi2994 C# (си шарп) 1 05.03.2015 18:28
List Структура в List структуре и тд по аналогии с Delphi Кислый C# (си шарп) 3 13.09.2014 21:06
List box 0creator0 Microsoft Office Word 9 27.09.2011 09:04
List Box Ekzamenator Помощь студентам 3 26.09.2011 21:32
[c++][list] Порядок обработки двух list Padavan Помощь студентам 1 10.05.2011 14:56