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 '
转换为整数。
是否有办法剥离所有非数字字符只是为了排序?
尝试:
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()
)
)
);