LINQ数字排序取代非数字字符

本文关键字:数字字符 取代 排序 数字 LINQ | 更新日期: 2023-09-27 18:05:09

我得到了以下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 '转换为整数。

是否有办法剥离所有非数字字符只是为了排序?

LINQ数字排序取代非数字字符

尝试:

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()之前

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

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