C# 使用LINQ to XML进行查询时,将元素值保留为字符串或将其转换为正确的类型是否更好/更有效?
在使用LINQ编写XML查询时,我经常遇到这样的问题:XElement的Value属性是字符串,但数据实际上可能是整数、布尔值等 假设我在查询中有一个“where”子句,用于检查存储在XElement中的ID是否与名为“ID”的局部(整数)变量匹配。我有两种方法可以做到这一点 1。将“id”转换为字符串C# 使用LINQ to XML进行查询时,将元素值保留为字符串或将其转换为正确的类型是否更好/更有效?,c#,parsing,casting,linq-to-xml,C#,Parsing,Casting,Linq To Xml,在使用LINQ编写XML查询时,我经常遇到这样的问题:XElement的Value属性是字符串,但数据实际上可能是整数、布尔值等 假设我在查询中有一个“where”子句,用于检查存储在XElement中的ID是否与名为“ID”的局部(整数)变量匹配。我有两种方法可以做到这一点 1。将“id”转换为字符串 string idString = id.ToString(); IEnumerable<XElement> elements = from b in Tab
string idString = id.ToString();
IEnumerable<XElement> elements =
from
b in TableDictionary["bicycles"].Elements()
where
b.Element(_ns + "id").Value == idString
select
b;
string idString=id.ToString();
可数元素=
从…起
b在TableDictionary[“bicycles”]中。元素()
哪里
b、 元素(_ns+“id”)。值==idString
选择
B
2。将元素值转换为int
IEnumerable<XElement> elements =
from
b in TableDictionary["bicycles"].Elements()
where
int.Parse(b.Element(_ns + "id").Value) == id
select
b;
IEnumerable<XElement> elements =
from
b in TableDictionary["bicycles"].Elements()
where
(int)b.Element(_ns + "id") == id
select
b;
IEnumerable元素=
从…起
b在TableDictionary[“bicycles”]中。元素()
哪里
int.Parse(b.Element(_ns+“id”).Value)=id
选择
B
我喜欢选项2,因为它对正确的类型进行比较。从技术上讲,我可以看到这样一种场景:将十进制或双精度转换为字符串会导致我将“1.0”与“1”(不相等)进行比较,而将十进制(1.0)与十进制(1)(相等)进行比较。虽然涉及小数的where子句可能非常罕见,但我可以在十进制列上看到OrderBy——在这种情况下,这将是一个非常现实的问题
然而,这种策略的一个潜在缺点是,解析查询中的大量字符串可能会导致性能下降(尽管我不知道这对典型查询是否有意义)。如果字符串比较有可能导致与正确值类型的比较不同的结果,那么只解析元素值可能更有效
那么,您是认真地解析元素值,还是仅在必要时解析?为什么?
谢谢
编辑:
我发现了一种简单得多的转换语法
3。将元素强制转换为int
IEnumerable<XElement> elements =
from
b in TableDictionary["bicycles"].Elements()
where
int.Parse(b.Element(_ns + "id").Value) == id
select
b;
IEnumerable<XElement> elements =
from
b in TableDictionary["bicycles"].Elements()
where
(int)b.Element(_ns + "id") == id
select
b;
IEnumerable元素=
从…起
b在TableDictionary[“bicycles”]中。元素()
哪里
(int)b.Element(_ns+“id”)==id
选择
B
我想从现在起,这将是我的首选方法……除非有人劝我放弃:)
编辑II:
自从发布我的问题后,我突然想到:这是XML。如果我真的有足够的数据使性能成为一个问题,我可能会使用一个真正的数据库。因此,另一个使用铸造的原因。如果不进行测量,很难评估性能问题。但我认为有两种情况
在这种情况下,您很可能需要测量结果,以确保所做的事情是正确的。我同意您的第二次编辑。如果性能是一个问题,那么使用更具可查询性的数据结构(或者只是从XML中按ID缓存字典以进行重复查找)比更改比较/解析值的方式可以获得更多
也就是说,我倾向于在XElement上使用各种显式强制转换覆盖。此外,如果您的ID可能是空的(安全性比抱歉好),您也可以对
int?
进行有效转换,这是一个非常好且深思熟虑的答案,但我想我正在寻找一个很好的经验法则,因为我没有时间对查询进行大量性能测试。谢谢