LINQ:排序方式(将字母视为数字)

时间:2011-09-05 08:07:10

标签: vb.net linq linq-to-objects

当我的数据包含数字和字母时,如何使用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      

有什么想法吗? 谢谢你的时间

2 个答案:

答案 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(或您决定需要使用的任何数字类型),那么您将获得异常。在这种情况下,你将不得不做一些更多涉及的事情,例如将你的序列投射到一个新的序列上,其中任何字符串代表数字转换为数字,其余字符串保留原样,结果是字母数字排序。