C#LINQ orderby

Dar*_*ung 3 c# linq sql-order-by

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

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

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

                 };
Run Code Online (Sandbox Code Playgroud)

哪个工作正常,直到BUILD_ORDER> 10,它在1之后命令10.

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

orderby Convert.ToInt32(y.Element("BUILD_ORDER").Value)
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 7

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
                  };
Run Code Online (Sandbox Code Playgroud)

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

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

请注意,如果缺少BUILD_ORDER或ELEMENT子元素,则这两个都将引发异常.你可以使用转换int?代替intfor 来修复它BUILD_ORDER,并转换string为ELEMENT:

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

如果存在BUILD_ORDER,则仍然会失败,但当然不能将其解析为整数.

如果您的数据应始终具有这些元素,则第一种形式更好,因为它会更早地检测到任何数据错误.

  • 正如澄清一样,这是因为XElement有一个Explict Casting的操作符重载类型为int以及许多其他[XElement Operators](http://msdn.microsoft.com/en-us/library/system.xml.linq. xelement.op_explicit(v = VS.90)的.aspx) (2认同)