Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ to XML进行查询时,将元素值保留为字符串或将其转换为正确的类型是否更好/更有效?_C#_Parsing_Casting_Linq To Xml - Fatal编程技术网

C# 使用LINQ to XML进行查询时,将元素值保留为字符串或将其转换为正确的类型是否更好/更有效?

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

在使用LINQ编写XML查询时,我经常遇到这样的问题:XElement的Value属性是字符串,但数据实际上可能是整数、布尔值等

假设我在查询中有一个“where”子句,用于检查存储在XElement中的ID是否与名为“ID”的局部(整数)变量匹配。我有两种方法可以做到这一点

1。将“id”转换为字符串

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。如果我真的有足够的数据使性能成为一个问题,我可能会使用一个真正的数据库。因此,另一个使用铸造的原因。

如果不进行测量,很难评估性能问题。但我认为有两种情况

  • 如果您迟早需要使用表达式中的大部分(或全部)值,那么最好提前支付转换为本机类型的CPU成本—尽早丢弃XML字符串数据
  • 如果您只打算接触(评估或使用)几个值,那么在消耗(或暂时接近消耗)时,将字符串数据惰性地转换为本机类型的CPU时间可能会更便宜
  • 现在,这只是CPU时间方面的考虑。我建议,一旦转换为本机值类型,数据本身占用的内存可能会大大减少。这使您可以尽早丢弃字符串(XML)数据

    简言之,像这样的问题很少有非黑即白的答案:这取决于您的场景、数据的复杂性、有多少数据以及何时使用(触摸或评估)

    更新 在Dan对我最初答案的评论中,他要求在没有时间或理由进行详细测量的情况下提供一般的经验法则

    我的建议是,在XML解析时更喜欢转换为本机类型,而不是保留字符串数据并进行惰性解析。这是我的理由

  • 代码在运行时已经消耗了一些CPU、I/O和内存资源
  • 在加载时(而不是在其他时间)进行转换时,代码更简单,因为这一切都可以通过简单的过程方式进行编码
  • 这可能也会提高内存效率
  • 当需要使用数据时,它已经是本机格式的数据-这比在使用时处理字符串数据的性能要好得多:使用本机类型进行比较和计算通常比处理字符串格式的数据要高效得多。这可能会使消费代码更简单
  • 同样,我建议这是一条经验法则:)在某些情况下,从性能角度来看,另一种方法更为优化,或者在某种程度上使代码“更好”(更内聚、模块化、更易于维护等)


    在这种情况下,您很可能需要测量结果,以确保所做的事情是正确的。

    我同意您的第二次编辑。如果性能是一个问题,那么使用更具可查询性的数据结构(或者只是从XML中按ID缓存字典以进行重复查找)比更改比较/解析值的方式可以获得更多


    也就是说,我倾向于在XElement上使用各种显式强制转换覆盖。此外,如果您的ID可能是空的(安全性比抱歉好),您也可以对
    int?

    进行有效转换,这是一个非常好且深思熟虑的答案,但我想我正在寻找一个很好的经验法则,因为我没有时间对查询进行大量性能测试。谢谢