当我的数据包含数字和字母时,如何使用linq对数据进行排序?
例如我当前的linq
Dim MyQuery = From c In XDoc.Descendants() _
Where c.Attribute(Y) IsNot Nothing And c.Attribute(Str) IsNot Nothing _
Order By Val(c.Attribute(Y).Value), Val(c.Attribute(X).Value) _
Select Str = c.Attribute(Str)
返回类似以下内容的内容
13
167
172
231
44
49
这不是我想要的...... 输出应该像下面那样
13
44
49
167
172
231
有什么想法吗? 谢谢你的时间
答案 0 :(得分:3)
请勿使用Value
的{{1}}属性 - 使用explicit conversion to Integer
。我认为这应该这样做:
XAttribute
请注意,使用Dim MyQuery = From c In XDoc.Descendants() _
Where c.Attribute(Y) IsNot Nothing And c.Attribute(Str) IsNot Nothing _
Order By CInt(c.Attribute(Y)), CInt(c.Attribute(X)) _
Select Str = c.Attribute(Str)
和XAttribute
支持的显式转换通常比使用XElement
等更好,因为随后将执行特定于XML的解析,适当的标准格式。
答案 1 :(得分:2)
将字符串转换为sort子句中的数字,例如
Dim MyQuery = From c In XDoc.Descendants() _
Where c.Attribute(Y) IsNot Nothing And c.Attribute(Str) IsNot Nothing _
Order By CInt(c.Attribute(Y)), CInt(c.Attribute(X)) _
Select Str = c.Attribute(Str)
请注意,如果任何字符串无法转换为int
(或您决定需要使用的任何数字类型),那么您将获得异常。在这种情况下,你将不得不做一些更多涉及的事情,例如将你的序列投射到一个新的序列上,其中任何字符串代表数字转换为数字,其余字符串保留原样,结果是字母数字排序。