我正在研究一种使用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实现的东西,这让我质疑一些东西。
仅仅遍历XElement
而不是创建字典会更好吗?我认为这不是一个好主意,因为我相信XElement
遍历可以调用无序的树遍历以获得我需要的东西。为每个属性(我只有3个)执行此操作将是非常低效的。我只是在这里猜测......
从dictionary
常数时间检索?我知道在Java HashMap
中有持续获取。如果这也是c#的情况,那么这似乎是一个更好的路线,因为我只会遍历一次,然后能够在恒定时间内检索我需要的任何东西。
答案 0 :(得分:3)
为什么不测量它?我会做任何使代码最简单的事情,并测量它。我希望你的代码中的字典更简单,所以我会选择它。但是,如果每个元素都是一个整数,我会使用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>
,则可以轻松更改它。)