我有一个我希望按最后两个结尾数字分组的项目列表,所以:
127658
012345
123456
123457
123458
012345
将排序为:
012345
012345
123456
123457
123458
127658
如何通过重载list.sort来实现这一点?输出将非常类似于excel自动过滤器,“ENDS WITH 00”
答案 0 :(得分:1)
不需要过载。只需使用lambda:
list.OrderBy(Function(n) Cint(n.toString().Substring(n.toString().Length-2))).
ThenBy(Function(n) n)
这是一个非常优秀的解决方案。
正如 Steven Doggart 所指出的那样,您可以检查短于2位的数字:
list.OrderBy(Function(n) Cint(n.toString().
Substring(n.toString().Length - Math.Min(n.ToString().Length, 2)))).
ThenBy(Function(n) n)
或者,甚至简单,使用 MarcinJuraszek 的答案的一部分:
list.OrderBy(Function(n) n Mod 100).ThenBy(Function(n) n)
答案 1 :(得分:0)
看起来很容易。比较功能:
Public Shared Function CompareByLastTwo(x As Integer, y As Integer) As Integer
Return (x Mod 100).CompareTo(y Mod 100)
End Function
用法:
Dim items as List(Of Integer)
(...)
items.Sort(CompareByLastTwo)
我认为您的商品为Integer
答案 2 :(得分:0)
这应该有效(假设List(Of String)
):
list = list.Select(Function(num) New With {
.Num = num,
.LastTwo = If(num.Length < 2, num, num.Substring(num.Length - 2))
}).
OrderBy(Function(x) x.LastTwo).
ThenBy(Function(x) x.Num).
Select(Function(x) x.Num).ToList()
如果它是List(Of Int32)
相同的方法:
intList = intList.
Select(Function(num) New With {.Num = num, .Str = num.ToString()}).
Select(Function(x) New With {
x.Num,
x.Str,
.LastTwo = If(x.Str.Length < 2, x.Str, x.Str.Substring(x.Str.Length - 2))
}).
OrderBy(Function(x) x.LastTwo).
ThenBy(Function(x) x.Num).
Select(Function(x) x.Num).ToList()