単一の LINQ 式ですべてのロジックを実行すると、あなたがどれほど賢いかを証明できます:) より冗長な方法で実行すると、コードが読みやすく、従うのが簡単になる場合があります。したがって、LINQ を使用したくない場合IComparer
は、カスタムの並べ替えアルゴリズムを含む独自のクラスを作成できます。
Public Class MyComparer
Implements IComparer(Of String)
Public Function Compare(ByVal x As String, ByVal y As String) As Integer Implements IComparer(Of String).Compare
Dim xParts() As String = x.Split("@"c)
Dim yParts() As String = y.Split("@"c)
'Get the integer value (after the @ symbol) of each parameter
Dim xValue As Integer = 0
Dim yValue As Integer = 0
If xParts.Length = 2 Then
Integer.TryParse(xParts(1), xValue)
End If
If yParts.Length = 2 Then
Integer.TryParse(yParts(1), yValue)
End If
'Compare y-to-x instead of x-to-y because we want descending order
Return yValue.CompareTo(xValue)
End Function
End Class
この例では、IComparerは標準の .NET フレームワーク インターフェイスであり、クラスに実装していますMyComparer
。Compareメソッド ( で定義IComparer
) は、単純に 2 つのパラメーターを取り、それらを比較します。x
より小さいy
(つまり、ソート順でx
前にある)場合、メソッドは負の数 (-1 など) を返します。が より大きい場合y
、正の数 (例: 1) を返します。とが等しい場合、メソッドは 0 を返します。x
y
x
y
ただし、この場合は、標準の整数の並べ替えを使用するだけなので、2 つの整数を比較して、必要に応じて負、正、またはゼロを返すInteger.CompareToを呼び出すことができます。
次に、Array.Sort
メソッドを呼び出すときに、カスタムIComparer
オブジェクトの 1 つを指定して、デフォルトの動作の代わりにカスタム ソート アルゴリズムを使用することができます。
Dim arrayToSort() As String = New String() {"bufallo@2000", "lice@20", "cell@1", "rat@150", "cow@10000"}
Array.Sort(arrayToSort, New MyComparer())
Sortメソッドは、指定したオブジェクトを使用して並べ替えIComparer
を実行します。配列内の 2 つの項目を比較してどちらが先かを確認する必要があるたびにMyComparer.Compare
、そのメソッドによって返された値を呼び出して使用し、適切な並べ替えを決定します。
MyComparer
同じアルゴリズムを使用して項目を並べ替える必要があるコード内のあらゆる場所で同じクラスを再利用できます。これは、LINQ アプローチに対するもう 1 つの利点です。独自のクラスを実装するIComparer
と、あらゆる種類の非常に強力なカスタマイズ可能な並べ替え順序を作成できます。