首页 > 解决方案 > 改进我选择具有唯一值的多个 XElement 来构建列表的方式

问题描述

有没有办法改进这一点?我觉得我有很多循环正在进行。

该代码从 XML 文档构建了一个包含域名的字符串。取决于 XML 文档中的域名是在 hostSW(host Starts With)、hostCN(host Contains)还是 hostEW(host EndsWith)元素中,取决于我是否需要在末尾、开头+结尾或值的开头。

我使用哈希集来确保没有重复。

var startWith = xdoc.Root
    .Descendants("Test")
    .Elements("hostSW")
    .ToList();
var contains = xdoc.Root
    .Descendants("Test")
    .Elements("hostCN")
    .ToList();
var endsWith = xdoc.Root
    .Descendants("Test")
    .Elements("hostEW")
    .ToList();

HashSet<string> domains = new HashSet<string>(); //use hashset so we don't duplicate results

foreach (XElement test in startWith)
{
    domains.Add(test.Value.ToString() + "*");
}
foreach (XElement test in contains)
{
    domains.Add("*" + test.Value.ToString() + "*");
}
foreach (XElement test in endsWith)
{
    domains.Add("*" + test.Value.ToString());
}

string out = "BEGIN FILE ";
foreach (string domain in domains.ToArray())
{
    out += "BEGIN DOMAIN ";
    out += domain;
    out += " END DOMAIN";
}
out += " END FILE;

return out;

XML 文件

<Tests>
    <Test>
        <hostSW>startsWith1</hostSW>
    </Test>
    <Test>
        <hostSW>startsWith2</hostSW>
    </Test>
    <Test>
        <hostCN>contains1</hostCN>
    </Test>
    <Test>
        <hostEW>endsWith1</hostEW>
    </Test>
</Tests>

标签: c#foreachhashsetxelement

解决方案


假设这样的 XML 结构

<Root>
    <Test>
        <hostSW>startsWith1</hostSW>
    </Test>
    <Test>
        <hostCN>contains1</hostCN>
    </Test>
    <Test>
        <hostCN>contains2</hostCN>
    </Test>
    <Test>
        <hostEW>endsWith1</hostEW>
    </Test>
    <Test>
        <hostEW>endsWith2</hostEW>
    </Test>
    <Test>
        <hostEW>endsWith3</hostEW>
    </Test>
</Root>

我正确获得了所有域,并且仅使用此代码迭代了 6 次

// Loop each of the elements one time without filtering element name
foreach (var test in xDoc.Root.Descendants("Test").Elements())
{
    // Switch on the name of the element.
    switch (test.Name.LocalName)
    {
        case "hostSW": { domains.Add(test.Value + "*"); } break;
        case "hostCN": { domains.Add("*" + test.Value + "*"); } break;
        case "hostEW": { domains.Add("*" + test.Value); } break;
    }
    // For any other elements we iterate just do nothing
}

推荐阅读