使用LINQ从域列表中删除子域

时间:2018-06-29 15:05:30

标签: c# linq

我有一个这样的字符串列表:

a@domain.com
b@sub.domain.com
c@sub.sub.domain.com
d@sub.domain2.com

我要删除子域,只保留domain.comdomain2.com等。

到目前为止,我已经尝试过但没有成功:

string[] campusCup(string[] emails)
{
    var emailList = emails.Select(x => x.Split('@').Last())
                        .Distinct()
                        .Select(x => x.Where(y => x.Split('.').Length > 2).Select(z => x.Split('.').Reverse().Take(2).Reverse()))
                        .Select(x => x)
                        .Distinct();

    return emailList.ToArray();
}

任何帮助解决任务或对我做错事情以及如何解决问题的解释表示赞赏。谢谢

3 个答案:

答案 0 :(得分:1)

鉴于您的数据集,这似乎对我有用:

var domains = emails.Select(e => e.Split('@')[1]).Select(d =>
{
    var parts = d.Split('.');
    return string.Join(".", parts.Skip(parts.Length - 2));
}).Distinct();

答案 1 :(得分:1)

您可以首先使用MailAddress获取主机,然后使用某些字符串方法仅获取最后两个:

string[] domains = emails
 .Select(e => new MailAddress(e).Host.Split('.'))
 .Select(arr => String.Join(".", arr.Skip(arr.Length - 2)))
 .Distinct()
 .ToArray();

答案 2 :(得分:1)

如果您只是想了解LINQ(如在问题注释中所提到的那样),那么这是另一个有趣的选择:

var reg = new Regex(@"[a-z0-9\.]+@[a-z0-9\.]*?(?<domain>[a-z0-9]+\.[a-z0-9]+)$");   
var secondLevelDomains = domains.SelectMany(domainName => reg.Matches(domainName).Cast<Match>()
                                                             .Select(m => m.Groups["domain"])
                                                             .Select(m => m.Value))
                                                             .Distinct();

它使用正则表达式中的匹配组来解析域名,以及一些更有趣的LINQ函数,例如Cast(用于将较旧的集合转换为LINQ友好枚举),SelectMany(合并多个项目的可枚举属性)和Distinct(仅返回唯一条目)。

这可能不是在实际应用程序中实现此目标的理想方法,但出于学习目的,它公开了许多LINQ功能。