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

问题描述 投票:2回答:3

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

[email protected]
[email protected]
[email protected]
[email protected]

我想删除子域名,只留下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();
}

任何帮助解决任务或解释我做错了什么以及如何解决它是值得赞赏的。谢谢

c# linq
3个回答
1
投票

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

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

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
投票

如果你只想了解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功能。

© www.soinside.com 2019 - 2024. All rights reserved.