LINQ数字排序替换非数字字符

时间:2013-03-20 14:38:03

标签: c# sql linq

我有以下LINQ查询: -

(from a in MyData
where a.Field1.Replace(" ","").Contains("ABCDEFG")
select a.Field2).Take(50)

它返回: -

114                                
115                                
115 A                              
116                                
116 A                              
118                                
119                                
122                                
124                                
128                                
131                                
132                                
133                                
95                                 
96                                 
97                                 
98                                 
99   

我需要能够以数字方式对此列表进行排序,我可以这样做: -

(from a in MyData
where a.Field1.Replace(" ","").Contains("ABCDEFG")
select a.Field2).Take(50).OrderBy(x => Convert.ToInt32(x))

问题在于: -

Conversion failed when converting the nvarchar value '111 A ' to data type int.

因为它显然无法将'111 A '转换为整数。

有没有办法只为排序剥离所有非数字字符?

2 个答案:

答案 0 :(得分:3)

尝试:

MyData.Where(d => Field1.Replace(" ","").Contains("ABCDEFG"))
    .AsEnumerable()
    .OrderBy(d => Convert.ToInt32(Regex.Split(d.Field2, @"\D+")[0]))
    .Take(50)
    .Select(d => d.Field2);

您可以根据所需的结果交换OrderBy()和Take()。但正如鲍勃·韦尔在下面提到的那样:

  

如果Take()是第一个,那么它应该在AsEnumerable()

之前

这样您就不会加载来自源的所有记录。

答案 1 :(得分:0)

不是那里最漂亮的代码,但是在你的sort lambda中,你可以创建一个仅由数字组成的新字符串,然后将其转换为排序值的整数。

.OrderBy(x => 
    Convert.ToInt32(new string(x.Where(c => char.IsDigit(c))
                                .ToArray()
                              )
                   )
        );