如何按域名或特定子串对邮件列表分组并生成子列表?
按邮件域名分组的实现方案
核心思路
从每个邮件地址中提取@符号后的完整域名作为分组键,通过LINQ的GroupBy方法完成分组,最终将每个子组转换为独立的字符串列表,支持所有类型的域名(如@yahoo.fr、@mail.ru等)。
实现代码
方式一:字符串分割(简单高效)
直接通过Split('@')提取域名部分,适合格式规范的邮件列表:
var emails = new List<string> { "a@gmail.com", "b@yahoo.fr", "c@tafmail.com", "b@mail.ru" }; // 分组并转换为字典:键为域名,值为对应邮件列表 var groupedEmails = emails.GroupBy(email => email.Split('@')[1]) .ToDictionary(group => group.Key, group => group.ToList());
方式二:正则表达式(兼容复杂场景)
如果需要处理格式更灵活的邮件地址,可使用正则提取域名,解决你之前正则使用失败的问题:
using System.Text.RegularExpressions; var emails = new List<string> { "a@gmail.com", "b@yahoo.fr", "c@tafmail.com", "b@mail.ru" }; // 正则匹配@后到字符串结尾的所有字符(即完整域名) var domainRegex = new Regex(@"@(.+)$"); var groupedEmailsWithRegex = emails.GroupBy(email => domainRegex.Match(email).Groups[1].Value) .ToDictionary(group => group.Key, group => group.ToList());
安全处理(兼容非法邮件地址)
如果列表中存在无@的非法地址,可先过滤再分组,避免报错:
// 字符串分割方式的安全版 var safeGroupedEmails = emails.Where(email => email.Contains("@")) .GroupBy(email => email.Split('@')[1]) .ToDictionary(group => group.Key, group => group.ToList()); // 正则方式的安全版 var safeGroupedEmailsRegex = emails.Where(email => domainRegex.IsMatch(email)) .GroupBy(email => domainRegex.Match(email).Groups[1].Value) .ToDictionary(group => group.Key, group => group.ToList());
使用分组结果
遍历分组后的字典,即可获取每个域名对应的邮件列表:
foreach (var domainGroup in groupedEmails) { Console.WriteLine($"域名:{domainGroup.Key}"); Console.WriteLine("邮件列表:"); foreach (var email in domainGroup.Value) { Console.WriteLine($" - {email}"); } }
输出示例:
域名:gmail.com 邮件列表: - a@gmail.com 域名:yahoo.fr 邮件列表: - b@yahoo.fr 域名:tafmail.com 邮件列表: - c@tafmail.com 域名:mail.ru 邮件列表: - b@mail.ru
内容的提问来源于stack exchange,提问作者Jakob
相关产品推荐
相关产品推荐

