1

我正在研究一种使用 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是从常数时间检索吗?我知道在 JavaHashMap中有不断的获取。如果 c# 也是如此,那么这似乎是一条更好的路线,因为我只需遍历一次,然后就可以在恒定时间内检索我需要的任何内容。

4

1 回答 1

3
  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);
}

(显然,这是将每个元素转换为 anint而不是 a string,但如果您真的想要一个 ,您可以轻松更改它IDictionary<string, string>。)

于 2013-06-13T20:22:49.807 回答