4

我有一个我想按最后两个结尾数字分组的项目列表,所以:

127658
012345
123456
123457
123458
012345

将排序为:

012345
012345
123456
123457
123458
127658

这是如何通过重载 list.sort 来实现的?输出与 excel 自动过滤器“ENDS WITH 00”非常相似

4

3 回答 3

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)
于 2013-04-10T15:39:07.763 回答
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

于 2013-04-10T15:34:33.323 回答
0

这应该有效(假设 a 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()
于 2013-04-10T15:37:50.243 回答