■VB.Netのジェネリックリストの並び替え
・VB.Netで構造体配列の使い方を調べました。
  並び替え方法を細かく指定できるので簡単なプログラムなら
 使い勝手が良いです。以下サンプル

Public Class Form1
    '構造体配列
    Public Structure P_Rec_
        Public code1 As String  'コード1
        Public code2 As String  'コード2
        Public name As String   '名前
    End Structure

    Shared Function CompareAccount(ByVal x As P_Rec_, ByVal y As P_Rec_) As Integer
        '並び替えの設定
        If x.code1 > y.code1 Then 'コード1
            Return 1
        ElseIf x.code1 < y.code1 Then
            Return -1
        Else
            If x.code2 > y.code2 Then 'コード2
                Return 1
            ElseIf x.code2 < y.code2 Then
                Return -1
            Else
                Return 0
            End If
        End If
    End Function

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        '配列作成
        Dim w_List As New System.Collections.Generic.List(Of P_Rec_)

        '配列に追加
        w_List.Add(precSet("01", "1001", "りんご"))
        w_List.Add(precSet("02", "1003", "デラウエア"))
        w_List.Add(precSet("01", "1002", "ふじ"))
        w_List.Add(precSet("01", "1005", "つがる"))
        w_List.Add(precSet("02", "1006", "ぶどう"))
        w_List.Add(precSet("01", "1004", "王林"))
        w_List.Add(precSet("02", "1007", "巨峰"))
        w_List.Add(precSet("01", "1003", "むつ"))
        w_List.Add(precSet("02", "1008", "マスカット"))
        w_List.Add(precSet("02", "1009", "ピオーネ"))

        For Each rec As P_Rec_ In w_List
            Debug.Print(rec.code1 & ":" & rec.code2 & ":" & rec.name)
        Next

        '並び換え
        w_List.Sort(AddressOf CompareAccount)
        Debug.Print("-------------------------------")

        For Each rec As P_Rec_ In w_List
            Debug.Print(rec.code1 & ":" & rec.code2 & ":" & rec.name)
        Next

    End Sub

    Function precSet(ByVal code1 As String, ByVal code2 As String, ByVal name As String) As P_Rec_
        '値を受け取って構造体にセットして返す
        Dim WPrec As P_Rec_
        WPrec = New P_Rec_
        WPrec.code1 = code1
        WPrec.code2 = code2 
        WPrec.name = name  
        Return WPrec
    End Function

End Class


・Public Structure P_Rec_〜が構造体の定義です。並び替えをするにはPublicで定義する必要があります。
・Shared Function CompareAccount(ByVal 〜が並び替えの設定です。
  xとy2つの値を受け取って戻り値で入れ替えるかどうかを返します
  複数キーでソートする場合はサンプルのように第1のキー、第2のキーと入れ子にして行きます
・w_List.Sort(AddressOf CompareAccount)で並び替えが出来ます。

結果
01:1001:りんご
02:1003:デラウエア
01:1002:ふじ
01:1005:つがる
02:1006:ぶどう
01:1004:王林
02:1007:巨峰
01:1003:むつ
02:1008:マスカット
02:1009:ピオーネ
-------------------------------
01:1001:りんご
01:1002:ふじ
01:1003:むつ
01:1004:王林
01:1005:つがる
02:1003:デラウエア
02:1006:ぶどう
02:1007:巨峰
02:1008:マスカット
02:1009:ピオーネ

code1,code2の順番に並び替える事ができました。
ふと気づくと同じコードが混ざっていましたがむしろちゃんと並び替えが上手く
いっているサンプルになって入る気がします。。。

トップへ戻る