【问题标题】:C# LINQ orderbyC# LINQ 排序
【发布时间】:2011-07-06 15:28:22
【问题描述】:

我有一个包含许多元素的 Xelement。

我有以下代码对它们进行排序:

var calculation = from y in x.Elements("row")
                 orderby y.Element("BUILD_ORDER").Value
                 select new
                 {
                     calcAttribute = y.Element("ELEMENT").Value

                 };

效果很好,直到 BUILD_ORDER > 10,它在 1 之后订购 10。

如果我想要严格的数字顺序,我将元素设置为 Int,这是正确的方法,还是 LINQ 有内置的扩展/方法?

orderby Convert.ToInt32(y.Element("BUILD_ORDER").Value)

【问题讨论】:

标签: c# linq sql-order-by


【解决方案1】:

LINQ to Objects 没有内置转换,但 LINQ to XML 有:

var calculation = from y in x.Elements("row")
                  orderby (int) y.Element("BUILD_ORDER")
                  select new
                  {
                      calcAttribute = y.Element("ELEMENT").Value
                  };

您是否有任何理由使用匿名类型,而不仅仅是选择您想要的值?例如:

var calculation = from y in x.Elements("row")
                  orderby (int) y.Element("BUILD_ORDER")
                  select y.Element("ELEMENT").Value;

请注意,如果缺少 BUILD_ORDER 或 ELEMENT 子元素,这两者都会引发异常。您可以通过将BUILD_ORDER 转换为int? 而不是int 并将ELEMENT 转换为string 来解决此问题:

var calculation = from y in x.Elements("row")
                  orderby (int?) y.Element("BUILD_ORDER")
                  select (string) y.Element("ELEMENT");

如果 BUILD_ORDER 存在但当然不能被解析为整数,这仍然会失败。

如果您的数据应该始终包含这些元素,那么第一种形式会更好,因为它会更早地检测到任何数据错误。

【讨论】:

  • 澄清一下,这是因为 XElement 有一个运算符重载,可用于显式转换以键入 int 以及许多其他 XElement Operators
  • 为什么我没有想到使用 XElement 的显式转换行为?这种事情就是为什么我不介意被Skeeted。 :)
  • 感谢 Jon,我使用匿名类型的原因是我的原始代码有许多值被提取出来,我需要使用这些值。我还没有更改代码。就错误而言 - 我今天已经多次了解到这一点:)我以前从未听说过(int?),我会对此进行阅读。感谢您的出色回答。
  • @Jon,Google 似乎不喜欢(int?),您介意解释一下它是如何工作的吗?
  • @Darren:这是Nullable<int> 的语法糖。在您最喜欢的 C# 书籍或网页中查找可为空的值类型。
【解决方案2】:

我觉得不错。您也可以使用Int32.Parse(...)。我不知道任何将字符串排序为整数的内置方法,但您当然可以编写自己的方法。

【讨论】:

    【解决方案3】:

    是的,因为您的 XML 值没有被输入,您必须手动转换它们以便 .NET 能够按数字排序。

    顺便说一下,int.Parse 会给你带来更好的性能。

    【讨论】:

      【解决方案4】:

      看起来它将构建顺序作为字符串而不是 int 读取。您的示例应该可以工作,或尝试

      orderby int.Parse(y.Element("BUILD_ORDER").Value)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-22
        • 1970-01-01
        • 2018-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多