list.sort,但groupby结束数字

时间:2013-04-10 15:24:32

标签: vb.net

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

127658
012345
123456
123457
123458
012345

将排序为:

012345
012345
123456
123457
123458
127658

如何通过重载list.sort来实现这一点?输出将非常类似于excel自动过滤器,“ENDS WITH 00”

3 个答案:

答案 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()