我的程序基本上做的是它搜索 xml 并返回那些在元素中具有特定值的文件名。
我想我必须先向您展示我的 xml,然后才能继续:
<DocumentElement>
<Protocol>
<DateTime>10.03.2003</DateTime>
<Item>Date</Item>
<Value />
</Protocol>
<Protocol>
<DateTime>05.11.2020</DateTime>
<Item>Status</Item>
<Value>Ok</Value>
</Protocol>
</DocumentElement>
我有几千个具有这种精确布局的 xml 文件。用户可以通过以下方法获取所有文件的列表:
public List<string> GetFiles(string itemValue, string element, string value)
{
return compatibleFiles.Where(path => XmlHasValue(path, itemValue, element, value)).ToList();
}
并且此方法返回 xml 是否具有所需的值:
private bool XmlHasValue(string filePath, string itemValue, string element, string value)
{
try
{
string foundValue = XDocument.Load(filePath)
.Descendants()
.Where(el => el.Name == "Item" && el.Value == itemValue)
.First()
.Parent
.Descendants()
.Where(des => des.Name == element && des.Value == value)
.First()
.Value;
return foundValue == value;
}
catch (Exception)
{
return false;
}
}
compatibleFiles
是一个列表,其中包含具有正确布局/格式(上面的 xml 代码)的 xml 文件的所有路径。用户提供以下GetFiles
方法:
itemValue
-> 'Item' 元素应该具有的值,例如“Status”element
-> 他要检查的元素的名称(在同一个“协议”元素中),fE“值”或“日期”value
->element
元素的值,在我们的示例中为“Ok”
问题是,这些方法需要很长时间才能完成,而且我几乎可以肯定有更好更快的方法来做我想做的事。我不知道是否GetFiles
可以更快,但XmlHasValue
肯定可以。以下是一些测试结果:
你们知道有什么更快的方法吗?这真的很有帮助。
更新
原来这一切都只是因为 IO 线程。如果你有同样的问题并且认为你的代码很糟糕,你应该首先检查它是否只是一个使用所有 cpu 能力的线程。