vb.net - 列表(字符串)排序,数字升序,字母降序

时间:2015-10-12 14:01:24

标签: arrays vb.net list sorting

我正在尝试将字符串列表排序为一个非常特殊的顺序。我有一个项目列表,其格式为“X123XXX”,其中X可以是一个字母,123可以是任何数字。

Dim AList As New List(Of String)
AList.Add("B200")
AList.Add("A100X")
AList.Add("A100XY")
AList.Add("A100XYZ")

AList.Sort()

'Actual Return in order (AList(1).tostring etc.)
'A100X
'A100XY
'A100XYZ
'B200

'Desired Return
'A100XYZ
'A100XY
'A100X
'B200

我遇到的问题是,我不仅需要对数字升序和降序进行排序,而且还需要对第一个字母Ascending进行排序。

我希望,因为部件总是采用相同的格式(字母+ 3个数字+可选最多3个字母) - 我可以选择前4个并对ASC进行排序,然后对最后3个进行DESC排序。但我不知道如何在vb.net中这样做。我已经浏览了一下,只能找到IComparable的东西,这看起来不太有用。

2 个答案:

答案 0 :(得分:5)

依靠某些LINQ方法(OrderByThenBy等),您可以获得所需内容;它们允许您执行所需的所有修改。

代码提供您想要的内容:

 AList = AList.OrderBy(Function(x) x.Substring(0, 1)).ThenBy(Function(x) Convert.ToInt32(x.Substring(1, 3))).ThenByDescending(Function(x) x.Substring(4)).ToList()

更新

上面的代码按字母顺序降序排列最后一部分(即从第5个位置到结尾的字母);但显然OP希望由于弦的长度(即,最长的一个和最短的一个)执行最后的分类。以下代码提供了这样的行为:

AList = AList.OrderBy(Function(x) x.Substring(0, 1)).ThenBy(Function(x) Convert.ToInt32(x.Substring(1, 3))).ThenByDescending(Function(x) x.Substring(4).Length).ToList()

答案 1 :(得分:2)

匿名函数的另一种方法是创建一个实现IComparer(Of String)的类:

Private Class CodeComparer
    Implements System.Collections.Generic.IComparer(Of String)

    Function Compare(ByVal a As String, ByVal b As String) As Integer _
             Implements IComparer(Of String).Compare
        Dim result As Integer = a.Substring(0, 4).CompareTo(b.Substring(0, 4))
        If result = 0 Then
            result = a.Substring(4).CompareTo(b.Substring(4)) * -1
        End If
        Return result
    End Function
End Class

按升序排序前4个字符,然后按降序排列其余字符(因此* -1)。

然后,您可以使用以下方式对列表进行排序:

items.Sort(New CodeComparer())

编辑:您也可以使用相同的算法,并将匿名函数传递给Sort方法。

items.Sort(Function(a, b)
               Dim result As Integer = a.Substring(0, 4).CompareTo(b.Substring(0, 4))
               If result = 0 Then result = a.Substring(4).CompareTo(b.Substring(4)) * -1
               Return tmp
           End Function)