使用XElement遍历的效率/性能
本文关键字:性能 效率 XElement 遍历 使用 | 更新日期: 2023-09-27 18:18:22
我正在研究一种使用xml解析数据的方法。
我得到的文件包含如下行:
George | Washington | Carver
或者其他人可以发给我这样的东西
Carver | Washington | George
等等…
无论格式是什么,发送文件的人也会发送如何解析文件的规则。在第一个例子中,它是名|中名|姓。在第二个例子中,它是姓|中名|名
我没有为每种可能性编写一个特例,而是创建了一个XML文件来描述元数据。
<file>
<first>0</first>
<middle>1</middle>
<last>2</last>
</file>
例如,在本例中。标签first
对应于0
,表示名字出现在第0个位置。
直观地,我想到创建一个字典,键设置为标记,值设置为文本。像这样…
public static IDictionary<string, string> GetLookupTable(string xmlContents)
{
XElement xmlElement = XElement.Parse(xmlContents);
IDictionary<string, string> table = new Dictionary<string, string>();
foreach (var element in xmlElement.Elements())
{
table.Add(element.Name.LocalName, element.Value);
}
return table;
}
然而,我并不真正熟悉。net实现的东西,这导致我质疑一些东西。
是否只是遍历
XElement
而不是创建字典更好?我不认为这是一个好主意,因为我相信XElement
遍历可能涉及无序树遍历来获得我需要的东西。对每个属性都这样做(我有不止3个属性)效率非常低。从
dictionary
检索是常数时间吗?我知道在JavaHashMap
有恒定的get。如果c#也是这种情况,那么这似乎是一个更好的路线,因为我只需遍历一次,然后能够在常数时间内检索我需要的任何内容。
-
为什么不测量它?我会先做让代码最简单的事情,然后衡量它。我希望字典对代码的其余部分更简单,所以我就这么做了。如果每个元素都是整数,那么我将使用
Dictionary<string, int>
。 -
是的,
Dictionary
是一个哈希表,所以它有O(1)查找假设你没有可怕的碰撞
我将使用LINQ的ToDictionary
:
public static IDictionary<string, int> GetLookupTable(string xmlContents)
{
return XElement.Parse(xmlContents)
.Elements()
.ToDictionary(x => x.Name.LocalName,
x => (int) x);
}
(显然,这是将每个元素转换为int
而不是string
,但如果你真的想要一个IDictionary<string, string>
,你可以很容易地改变它。)