0

我有以下 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 '为整数。

有没有什么方法可以去除所有非数字字符只是为了排序?

4

2 回答 2

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()。然而,正如 Bob Vale 所指出的:

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

这样您就不会从源中加载所有记录。

于 2013-03-20T14:41:58.687 回答
0

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

.OrderBy(x => 
    Convert.ToInt32(new string(x.Where(c => char.IsDigit(c))
                                .ToArray()
                              )
                   )
        );
于 2013-03-20T14:42:15.697 回答