#c# #linq #grouping
Вопрос:
я хочу сгруппировать список писем их получателям.
Этот lstMails
список представляет собой List<MailModel>
MailModel обладает свойством string[] To.
например, в этом списке может быть 5 писем.
- Почта 1.Кому = [«nico.test@test.de»]
- Почта 2.Кому = [«nico.test@test.de», «nico.frank@test.de»]
- Почта 3.Кому = [«nico.jeff@test.de»]
- Почта 4.Кому = [«nico.star@test.de», «nico.frank@test.de»]
- Почта 5.Кому = [«nico.jeff@test.de»]
я хотел бы получить список для каждого получателя почты.
Так, например
- «lstNicoTest» = [ Почта 1, почта 2 ]
- «lstNicoJeff» = [ Почта 3, почта 5 ]
- «lstNicoFrank» = [ Почта 2, Почта 4 ]
- «lstNicoStar» = [ Почта 5 ]
в лучшем случае это будет ForEach(List<MailModel> list in lstMails.GroupBy(-----))
я не знаю, что я гуглил, но проблема в том, что, если я группируюсь по ней, она проверяет только, одинаковы ли массивы, в основном, если .Чтобы ["reci1", "reci"] == ["reci1", "reci"]
это не «копировало» их в основном
если я не предоставил достаточной информации, извините, я здесь для редактирования..
Ответ №1:
Вы можете выбрать всех получателей, затем выделить их, а затем отфильтровать lstMails
для пользователя.
Что-то вроде:
lstMails
.SelectMany(mail => mail.To)
.Distinct()
.Select(user => lstMails.Where(mail => mail.To.Contains(user))
Ответ №2:
Я считаю, что это дает желаемый результат:
var mailsByRecipient = (from m in lstMails
from recipient in m.To
select new { m, recipient } into s
group s by s.recipient into g
select new { recipient = g.Key, mails = g.Select(x => x.m) })
.ToList();
Он возвращает список каждого уникального получателя электронной почты со списком MailModel
адресов, в которых он находится.
Это достигается тем, что сначала создается декартово произведение каждого получателя с соответствующим MailModel
(into s
) и используется для группировки по получателю (into g
).
Последний выбор является чисто эстетическим, создавая новый объект, содержащий свойства recipient
и mails
. Я нахожу странным работать с IGrouping<TKey, TElement>
ним напрямую.
Комментарии:
1. Это сработало как заклинание ! и я должен сказать, что помимо именования, которое мне нравится, чтобы быть более «читабельным» в Linq, это именно то, что я хотел. Даже выбор нового действительно полезен, обратите на это внимание ! этот запрос действительно побудил меня глубже погрузиться в Linq !. Отличная штука