1

「Q19_1_1」、「Q19_10_1」、「Q19_5_1」という形式の文字列の ArrayList があります。通常のソート方法では、リストは次のようにソートされます

"Q19_1_1"  
"Q19_10_1"
"Q19_5_1"

しかし、名前の2番目の整数と3番目の整数に基づいて数値的にソートしたいと思います。だから私はしたい:

"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

1

あなたは正しいです-問題は、完全に異なるインターフェースであるを実装IComparer(Of String)したが、実装しなかったことです。IComparer

List(Of String)の代わりにa を使用するように切り替えるとArrayList、正しく機能します。

これにより、コレクション内で型の安全性も確保されます。

一般に、ArrayList(およびその他のSystem.Collectionsタイプ) は、新しい開発では避ける必要があります。

于 2013-09-19T17:06:58.720 に答える