使用XElement遍历的效率/性能

时间:2013-06-13 20:18:14

标签: c# xml xml-parsing

我正在研究一种使用xml解析数据的方法。

我给出的文件包含如下所示的行:

George | Washington | Carver

或其他人可以发送给我这样的东西

Carver | Washington | George

等等......

无论格式是什么,向我发送文件的人也会向我发送有关如何解析文件的规则。在第一个例子中,它是First Name |中间名|姓。在第二个例子中,它是姓氏|中间名|名字

我没有为每种可能性编写特殊情况,而是创建了一个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中有持续获取。如果这也是c#的情况,那么这似乎是一个更好的路线,因为我只会遍历一次,然后能够在恒定时间内检索我需要的任何东西。

1 个答案:

答案 0 :(得分:3)

  1. 为什么不测量它?我会做任何使代码最简单的事情,并测量它。我希望你的代码中的字典更简单,所以我会选择它。但是,如果每个元素都是一个整数,我会使用Dictionary<string, int>

  2. 是的,Dictionary是一个哈希表,因此假设您没有可怕的冲突,它有O(1)查找。

  3. 我会使用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>,则可以轻松更改它。)