相关项目清单

时间:2018-04-25 21:28:12

标签: c# .net

我有一个文本文件,其格式类似于以下内容:

#
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
}
  1. 有没有办法检查两个值是否存在于同一个列表项中?

  2. Contains方法是否会返回ab123example4.net以查询“example4.net”或类似内容?

  3. 我会更好地使用不同的变量类型,例如字典吗?

2 个答案:

答案 0 :(得分:3)

  1. 是的,只需将条件添加到过滤器:

    var match = _CompanyOwnedDomains
        .FirstOrDefault(domains => domains.Contains(domainA.ToString()
                                && domains.Contains(domainB.ToString());
    
  2. 是的,example4.net包含在ab123example4.net ...

  3. 您可以使用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()));
    
  4. 作为@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");