【问题标题】:Casting Error when sorting with IComparer使用 IComparer 排序时出现转换错误
【发布时间】:2013-09-19 17:05:35
【问题描述】:

我有一个“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) 类型?

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

【问题讨论】:

    标签: vb.net sorting arraylist icomparer


    【解决方案1】:

    使用 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 接口

    【讨论】:

      【解决方案2】:

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

      如果您改用List(Of String) 而不是ArrayList,它将正常工作。

      这还将为您的集合中的类型提供安全性。

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

      【讨论】:

      • 请问为什么要避免使用ArrayList? List 在 VB.Net 中是否被普遍接受并用于确保正确的对象类型?到目前为止,我大部分时间都在使用 Java,Java 中的 ArrayList 允许分配对象类型,所以我已经习惯使用 ArrayList,但改变 VB.net 的习惯没有问题。
      • @Zifendale ArrayList 是早于泛型的类。通常,它只存在于向后兼容 .NET 1.1。使用System.Collections.Generic 选项总是更好,特别是如果您使用值类型(没有装箱),而且还因为提供类型安全。
      猜你喜欢
      • 1970-01-01
      • 2012-12-22
      • 2013-06-25
      • 2012-12-29
      • 2016-06-14
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多