我正在尝试将字符串列表排序为一个非常特殊的顺序。我有一个项目列表,其格式为“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的东西,这看起来不太有用。
答案 0 :(得分:5)
依靠某些LINQ
方法(OrderBy
,ThenBy
等),您可以获得所需内容;它们允许您执行所需的所有修改。
代码提供您想要的内容:
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)