使用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实现的东西,这导致我质疑一些东西。

  1. 是否只是遍历XElement而不是创建字典更好?我不认为这是一个好主意,因为我相信XElement遍历可能涉及无序树遍历来获得我需要的东西。对每个属性都这样做(我有不止3个属性)效率非常低。

  2. dictionary检索是常数时间吗?我知道在Java HashMap有恒定的get。如果c#也是这种情况,那么这似乎是一个更好的路线,因为我只需遍历一次,然后能够在常数时间内检索我需要的任何内容。

使用XElement遍历的效率/性能

  1. 为什么不测量它?我会先做让代码最简单的事情,然后衡量它。我希望字典对代码的其余部分更简单,所以我就这么做了。如果每个元素都是整数,那么我将使用Dictionary<string, int>

  2. 是的,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>,你可以很容易地改变它。)