改进了选择具有唯一值的多个XElement来构建列表的方式

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

是否有方法可以对此进行改进?我觉得我有办法进行许多循环。

该代码从XML文档中构建一个带有域名的字符串。取决于XML文档中的域名是在hostSW(主机开头为),hostCN(主机包含)或hostEW(主机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# foreach hashset xelement
2个回答
0
投票

假设这样的XML结构

<Root>
    <Test>
        <hostSW>startsWith1</hostSW>
        <hostCN>contains1</hostCN>
        <hostCN>contains2</hostCN>
        <hostEW>endsWith1</hostEW>
        <hostEW>endsWith2</hostEW>
        <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
}

0
投票

使用Linq可以进行XML:

    var t = xml.Root.Descendants("Test")
        .Elements()
        .Where(x => x.Name == "hostSW" || x.Name == "hostCN" || x.Name == "hostEW")
        .Select(x => (x.Name == "hostSW") ? $"{x.Value}*" : (x.Name == "hostCN" ? $"*{x.Value}*" : $"*{x.Value}"));
© www.soinside.com 2019 - 2024. All rights reserved.