LINQ 分组到同一收件人
LINQ Grouping to same recipient
我想将邮件列表分组到他们的收件人。
lstMails
列表是 List<MailModel>
MailModel 有一个 属性 这是
string[] 到.
例如,此列表中可能有 5 封邮件。
- Mail1.To = ["nico.test@test.de"]
- Mail2.To = ["nico.test@test.de", "nico.frank@test.de"]
- Mail3.To = ["nico.jeff@test.de"]
- Mail4.To = ["nico.star@test.de", "nico.frank@test.de"]
- Mail5.To = ["nico.jeff@test.de"]
我想获取每个邮件收件人的列表。
例如
- "lstNicoTest" = [邮件 1,邮件 2]
- "lstNicoJeff" = [Mail3, Mail5]
- "lstNicoFrank" = [Mail2, Mail4]
- "lstNicoStar" = [邮件5]
最好是 ForEach(List<MailModel> list in lstMails.GroupBy(-----))
我不知道我一直在谷歌搜索,但问题是如果我 Group By 它只检查数组是否相同,基本上如果 .To 是 ["reci1", "reci"] == ["reci1", "reci"]
它基本上不会“复制”它们
如果我没有提供足够的信息,我很抱歉,我在这里编辑..
您可以获取所有收件人,然后区分他们,然后过滤 lstMails
用户。
类似于:
lstMails
.SelectMany(mail => mail.To)
.Distinct()
.Select(user => lstMails.Where(mail => mail.To.Contains(user))
我相信这会给出预期的结果:
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();
它 returns 每个唯一电子邮件收件人的列表,其中包含 MailModel
个列表。
它通过首先创建每个收件人的笛卡尔积及其各自的MailModel
(进入s
),并使用它按收件人分组(进入g
)来实现这一点。
最后一个 select 纯粹是为了美观,创建了一个包含属性 recipient
和 mails
的新对象。我发现直接使用 IGrouping<TKey, TElement>
很奇怪。
我想将邮件列表分组到他们的收件人。
lstMails
列表是 List<MailModel>
MailModel 有一个 属性 这是 string[] 到.
例如,此列表中可能有 5 封邮件。
- Mail1.To = ["nico.test@test.de"]
- Mail2.To = ["nico.test@test.de", "nico.frank@test.de"]
- Mail3.To = ["nico.jeff@test.de"]
- Mail4.To = ["nico.star@test.de", "nico.frank@test.de"]
- Mail5.To = ["nico.jeff@test.de"]
我想获取每个邮件收件人的列表。
例如
- "lstNicoTest" = [邮件 1,邮件 2]
- "lstNicoJeff" = [Mail3, Mail5]
- "lstNicoFrank" = [Mail2, Mail4]
- "lstNicoStar" = [邮件5]
最好是 ForEach(List<MailModel> list in lstMails.GroupBy(-----))
我不知道我一直在谷歌搜索,但问题是如果我 Group By 它只检查数组是否相同,基本上如果 .To 是 ["reci1", "reci"] == ["reci1", "reci"]
它基本上不会“复制”它们
如果我没有提供足够的信息,我很抱歉,我在这里编辑..
您可以获取所有收件人,然后区分他们,然后过滤 lstMails
用户。
类似于:
lstMails
.SelectMany(mail => mail.To)
.Distinct()
.Select(user => lstMails.Where(mail => mail.To.Contains(user))
我相信这会给出预期的结果:
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();
它 returns 每个唯一电子邮件收件人的列表,其中包含 MailModel
个列表。
它通过首先创建每个收件人的笛卡尔积及其各自的MailModel
(进入s
),并使用它按收件人分组(进入g
)来实现这一点。
最后一个 select 纯粹是为了美观,创建了一个包含属性 recipient
和 mails
的新对象。我发现直接使用 IGrouping<TKey, TElement>
很奇怪。