Группировка LINQ для одного и того же получателя

#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 !. Отличная штука