c# - 改进我选择具有唯一值的多个 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>
解决方案
假设这样的 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
}
推荐阅读
- reactjs - Material-ui FormControlLabel 默认未选中
- laravel - 在网络服务器上克隆 Laravel 站点后无法弄清楚缺少什么
- reactjs - axios response.data 为空
- android - 如何检查我的 listview 适配器是否被我的 editext 文本过滤?
- vue.js - 当用户在 Vue 和 Vuex 中从第一条路线转到第二条路线和第二条路线到第一条路线时,想要在第一条路线上运行功能
- python - 为什么 random.uniform(0, float("inf")) 总是返回 inf?
- gulp - 如何让 gulp 同时写入所有文件?
- laravel - 重命名命令后phpunit错误异常?
- kubernetes - 来自服务器的错误(未找到):找不到 deployments.extensions “hello-node-64c578bdf8-jp7dt”
- android - 无法解决“所有 com.android.support 库必须使用完全相同的版本规范”