1

我有一个“Q19_1_1”、“Q19_10_1”、“Q19_5_1”形式的字符串数组列表。使用正常的排序方法,列表将被排序为

"Q19_1_1"  
"Q19_10_1"
"Q19_5_1"

但我想根据名称中的第二个整数和第三个整数对它进行数字排序。所以我想:

"Q19_1_1"
"Q19_5_1"  
"Q19_10_1"

我的子:

    Dim varSet As New ArrayList

    varSet.Add("Q19_1_1")
    varSet.Add("Q19_10_1")
    varSet.Add("Q19_5_1")

    varSet.Sort(New VariableComparer())

我有一个 IComparer:

Public Class VariableComparer
Implements IComparer(Of String)

Public Function Compare(ByVal x As String, ByVal y As String) As Integer Implements System.Collections.Generic.IComparer(Of String).Compare

    Dim varPartsX As Array
    Dim varPartsY As Array
    varPartsX = x.Split("_")
    varPartsY = y.Split("_")

    Return String.Compare(varPartsX(1), varPartsY(1))
End Function
End Class

但是当我尝试排序时,我得到了错误:

Unable to cast object of type 'VBX.VariableComparer' to type 'System.Collections.IComparer'.

VariableComparer 实现了 IComparer 但我猜它不能是 IComparer(Of String) 类型?

我该如何解决这个问题?我错过了什么?

4

2 回答 2

2

使用 List(Of String) 还可以让您访问 LINQ 扩展。特别是 OrderBy 和 ThenBy 扩展。你可以这样做:

    Dim test3 As New List(Of String)({"Q19_1_1", "Q19_10_1", "Q19_5_1", "Q19_5_2"})
    test3 = test3.OrderBy(Of Integer)(Function(s) Integer.Parse(s.ToString.Split("_"c)(1))) _
                 .ThenBy(Of Integer)(Function(s2) Integer.Parse(s2.ToString.Split("_"c)(2))).ToList

转换为整数可为您提供正确的排序,而无需使用新的 IComparer 接口

于 2013-09-19T18:04:38.087 回答
1

你是对的 - 问题是你实现了IComparer(Of String),但不是IComparer,这是一个完全不同的界面。

如果您切换到使用 aList(Of String)而不是ArrayList,它将正常工作。

这也将在您的收藏中为您提供类型安全性。

一般来说,ArrayList(和其他System.Collections类型)在新开发中应该避免。

于 2013-09-19T17:06:58.720 回答