作为对 LB 答案的补充,可以创建一个更通用的数组比较器,如下所示:
Public Class ArrayComparer(Of T As IComparable)
Implements IComparer(Of T())
Public Function Compare(x() As T, y() As T) As Integer Implements IComparer(Of T()).Compare
Dim i, n As Integer
For i = 0 To (Math.Min(x.Count, y.Count) - 1)
n = x(i).CompareTo(y(i))
If (n <> 0) Then Return n
Next
Return x.Length.CompareTo(y.Length)
End Function
End Class
现在,给定以下列表:
Dim list As New List(Of Integer())
For i As Integer = 1 To 2
For j As Integer = 1 To 2
For k As Integer = 1 To 2
For l As Integer = 1 To 2
list.Add(New Integer() {i, j, k, l})
Next
list.Add(New Integer() {i, j, k})
Next
list.Add(New Integer() {i, j})
Next
list.Add(New Integer() {i})
Next
还有以下动作:
list = list.OrderBy((Function(a As Integer()) a), New ArrayComparer(Of Integer)).ToList()
结果如下:
1
1,1
1,1,1
1,1,1,1
1,1,1,2
1,1,2
1,1,2,1
1,1,2,2
1,2
1,2,1
1,2,1,1
1,2,1,2
1,2,2
1,2,2,1
1,2,2,2
2
2,1
2,1,1
2,1,1,1
2,1,1,2
2,1,2
2,1,2,1
2,1,2,2
2,2
2,2,1
2,2,1,1
2,2,1,2
2,2,2
2,2,2,1
2,2,2,2
如果需要,添加辅助排序表达式以包含长度。
list = list.OrderBy((Function(a As Integer()) a), New ArrayComparer(Of Integer)).ThenBy(Function(a As Integer()) a.Length).ToList()
结果:
1
2
1,1
1,2
2,1
2,2
1,1,1
1,1,2
1,2,1
1,2,2
2,1,1
2,1,2
2,2,1
2,2,2
1,1,1,1
1,1,1,2
1,1,2,1
1,1,2,2
1,2,1,1
1,2,1,2
1,2,2,1
1,2,2,2
2,1,1,1
2,1,1,2
2,1,2,1
2,1,2,2
2,2,1,1
2,2,1,2
2,2,2,1
2,2,2,2