C#林克订货人

C#林克订货人,c#,linq,sql-order-by,C#,Linq,Sql Order By,我有一个包含许多元素的元素 我有以下代码对它们进行排序: var calculation = from y in x.Elements("row") orderby y.Element("BUILD_ORDER").Value select new { calcAttribute = y.Element("ELEMENT").Value

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

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

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)

LINQ到对象没有内置转换,但LINQ到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\u ORDER
,可以使用转换为
int?
而不是
int
,对于元素,可以使用转换为
string

var calculation = from y in x.Elements("row")
                  orderby (int?) y.Element("BUILD_ORDER")
                  select (string) y.Element("ELEMENT");
如果构建顺序存在,但不能解析为整数,则仍然会失败


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

在我看来不错。您还可以使用
Int32.Parse(…)
。我不知道有什么内置的方法可以将字符串排序为整数,但您当然可以自己编写。

是的,因为您的XML值没有键入,所以您必须手动转换它们,以便.NET能够进行数字排序


顺便说一句,
int.Parse
将为您提供稍好的性能。

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

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

作为澄清,这是因为XElement有一个操作符重载,用于显式转换为int类型,以及许多其他类型。为什么我没有想到使用XElement的显式转换行为?这就是为什么我不介意被抓的原因。:)谢谢Jon,我之所以使用匿名类型是因为我的原始代码中提取了许多我需要使用的值。我还没有更改代码。就错误而言,我今天已经了解了很多次:)我以前从未听说过(int?),我将对此进行一番阅读。谢谢你的回答。@Jon,谷歌似乎不喜欢(int?),你介意解释一下它是如何工作的吗?@Darren:这是
Nullable
的语法糖。在您最喜欢的C#书或网页中查找可为空的值类型。请参见以下内容: