Linq, как объединить массив объектов внутри списка и группировать по значению - PullRequest
0 голосов
/ 20 июня 2020

У меня проблема, мне нужна помощь. У меня есть список объектов, у которых много свойств, но важны только два: «От» и «Кому».

objectData {«От»: «ContactDTO», «Кому»: [«ContactDTO» ], ... // другие поля}

contactDto {"email": "string", ... other fields}

и мне нужно вернуть новый список с уникальными записями "From ", массив контактов" Кому "без дубликатов.

Тестовые данные:

{ 
   "From": { "email" : "user1@test.com"}, 
   "To": "[{ "email" : "user2@test.com"}, { "email" : "user3@test.com"}]"
},
{ 
   "From": { "email" : "user1@test.com"}, 
   "To": "[{ "email" : "user3@test.com"}, { "email" : "user4@test.com"}]"
},
{ 
   "From": { "email" : "user2@test.com"}, 
   "To": "[{ "email" : "user4@test.com"}, { "email" : "user5@test.com"}]"
},

Должен вернуть:

[
"From": { "email" : "user1@test.com"}, 
   "To": "[{ "email" : "user2@test.com"}, { "email" : "user3@test.com"}, { "email" : "user4@test.com"}]"
{ 
   "From": { "email" : "user2@test.com"}, 
   "To": "[{ "email" : "user4@test.com"}, { "email" : "user5@test.com"}]"
}
]

Я знаю, как это сделать на al oop, но я хотел бы сделать его более читаемым и чистым с помощью linq.

Я пробовал:

var newData = data.Where(x => IsReview(x))
                .Select(x => 
                new { 
                    From = x.From.EmailAddress, 
                    List = x.To.Select(z => z.EmailAddress).ToList() 
                }).GroupBy(y => y.From);

1 Ответ

2 голосов
/ 20 июня 2020

Вы можете Выбрать новый объект после GroupBy и использовать SelectMany для сглаживания электронных писем в один список, как в следующем коде:

var newData = data.Where(x => IsReview(x))
    .Select(x => new 
    { 
        From = x.From.EmailAddress, 
        List = x.To.Select(z => z.EmailAddress).ToList() 
    }).GroupBy(y => y.From)
    .Select(x => new
    {
        From = x.Key,
        To = x.SelectMany(y => y.List).ToList()
    });

Надеюсь, вы найдете это полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...