1

文字列配列を使用するのはまったく初めてです。次の例を検討してください。

テキストボックスに次の値があります。

bufallo@2000
lice@20
cell@1
rat@150
cow@10000

それらを並べ替えると、上記のリストのようにアルファベット順に並べ替えられます。ただし、@ 記号に続く整数値を使用して降順で並べ替える必要があります。したがって、たとえば、上記のリストを次のように並べ替えます。

cow@10000
bufallo@2000
rat@150
lice@20
cell@1

そのように降順に並べる方法がわかりません。

4

2 に答える 2

2

単一の 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 フレームワーク インターフェイスであり、クラスに実装していますMyComparerCompareメソッド ( で定義IComparer) は、単純に 2 つのパラメーターを取り、それらを比較します。xより小さいy(つまり、ソート順でx前にある)場合、メソッドは負の数 (-1 など) を返します。が より大きい場合y、正の数 (例: 1) を返します。とが等しい場合、メソッドは 0 を返します。xyxy

ただし、この場合は、標準の整数の並べ替えを使用するだけなので、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と、あらゆる種類の非常に強力なカスタマイズ可能な並べ替え順序を作成できます。

于 2013-01-02T13:38:53.347 に答える
1

文字列の数値部分で並べ替えますか? 正規表現は必要ありません。

あなたは使用することができString.SplitますEnumerable.OrderByDescending

Dim number As Int32 = Int32.MinValue
Dim orderedLines = From line In TextBox1.Lines
                   Let parts = line.Split("@"c)
                   Let numericPart = parts.Last()
                   Let success = Int32.TryParse(numericPart, number)
                   Select LineInfo = New With {line, number}
                   Order By LineInfo.number Descending
                   Select LineInfo.line
' if you want to reassign it to the TextBox:
TextBox1.Lines = orderedLines.ToArray()
于 2013-01-02T13:00:31.337 に答える