我有一个文本文件,其格式类似于以下内容:
#
example1.com;example2.com;example3.com
example4.net;example6.org
example7.uk;example8.io;ab123example4.net
#
每一行定义一家公司拥有的域名。 每行可以有2个或更多域。
不幸的是我无法修改文件的格式。
我对c#不太熟悉(我通常在Linux / Unix上使用bash / sh,我可能会默认使用grep)并试图扩展一些现有的c#软件来检查两个域是否属于同一家公司。
目前我正在阅读文件如下:
private List<string> _CompanyOwnedDomains;
private String CompanyOwnedDomainsFileName = Environment.GetEnvironmentVariable(
"DomainChecker",
EnvironmentVariableTarget.Machine) +
@"Path\To\CompanyOwnedDomains.config";
// Various error checking happens here
_CompanyOwnedDomains = File
.ReadAllLines(CompanyOwnedDomainsFileName)
.Where(line => !String.IsNullOrEmpty(line))
.Where(line => !line.StartsWith("#"))
.Select(line => line.ToLower())
.ToList();
当我接受检查时,到目前为止,我对如何与上述内容进行互动感到困惑。
为了论证,我们假设我有两个变量,DomainA和DomainB。 我想检查两个域是否归同一家公司所有。
我可以做类似以下的事情,但这看起来效率很低:
var Match = _CompanyOwnedDomains
.FirstOfDefault(DomainsList => DomainsList.Contains(DomainA.ToString());
if(Match != null) && Match.Contains(DomainB.ToString())
{
// Do stuff
}
有没有办法检查两个值是否存在于同一个列表项中?
Contains方法是否会返回ab123example4.net以查询“example4.net”或类似内容?
我会更好地使用不同的变量类型,例如字典吗?
答案 0 :(得分:3)
是的,只需将条件添加到过滤器:
var match = _CompanyOwnedDomains
.FirstOrDefault(domains => domains.Contains(domainA.ToString()
&& domains.Contains(domainB.ToString());
是的,example4.net
包含在ab123example4.net
...
您可以使用HashSet<string>
代替List<string>
:
_CompanyOwnedDomains = new HashSet<string>(
// ReadLines allows you to process before reading the entire file
File.ReadLines(CompanyOwnedDomainsFileName)
.Where(line => !String.IsNullOrEmpty(line))
.Where(line => !line.StartsWith("#"))
.Select(line => line.ToLower()));
作为@Steve noticed,您可以通过拆分值并直接使用条目来获得更好的效果:
_CompanyOwnedDomains = new HashSet<string>(
// ReadLines allows you to process before reading the entire file
File.ReadLines(CompanyOwnedDomainsFileName)
.Where(line => !String.IsNullOrEmpty(line))
.Where(line => !line.StartsWith("#"))
.SelectMany(line => line.ToLower().Split(';')));
然后您可以使用以下方法简化搜索:
var match = _CompanyOwnedDomains
.FirstOrDefault(domains => domains == domainA.ToString()
|| domains == domainB.ToString());
答案 1 :(得分:2)
我认为您需要另一个传递才能从您的文件中正确提取域名。
首先,使用ReadLine instead of ReadAllLines,然后你应该检查由所有空格组成的行,而不仅仅是空行,最后,在将行转换为小写后,你可以将它拆分为分号和结果数组可以使用SelectMany添加到列表中 如果您需要删除域重复项,可以使用Distinct。
_CompanyOwnedDomains = File
.ReadLines(CompanyOwnedDomainsFileName)
.Where(line => !String.IsNullOrWhiteSpace(line))
.Where(line => !line.StartsWith("#"))
.SelectMany(line => line.ToLower().Split(';'))
.Distinct().ToList();
现在每个域都与其他域分开,您无需担心Contains的误报,因为您可以使用列表中的Any
方法来检查您的搜索是否匹配< / p>
bool exist = _CompanyOwnedDomains.Any(x => x == "example4.net" || x == "example8.io");