tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル構造体配列のソートについて
記事No733
投稿日: 2004/02/20(Fri) 09:57
投稿者タートル
[OSのVer]:Windows    [VBのVer]:VB.NET  

構造体配列を使用して複数キー指定でソートをしたいのですが(DBでいうORDER BY)
どなたかよい方法をご存知ないでしょうか?
単一キー指定のソートは普通のソートでできるのですが。。。。
教えていただけると幸いです。

[ツリー表示へ]
タイトルRe: 構造体配列のソートについて
記事No734
投稿日: 2004/02/20(Fri) 12:55
投稿者魔界の仮面弁士
> 構造体配列を使用して複数キー指定でソートをしたいのですが(DBでいうORDER BY)

構造体にIComparableインターフェイスを実装しておけば、呼び出し側は、
『  Array.Sort(構造体配列変数)  』の1行だけでソートを行えます。


Protected Friend Structure MyUDT : Implements System.IComparable
    Friend Code As Integer, Name As String
    Friend Sub New(ByVal Code As Integer, ByVal Name As String)
        Me.Code = Code
        Me.Name = Name
    End Sub
    Private Function CompareTo(ByVal obj As Object) As Integer Implements System.IComparable.CompareTo
        Dim cmp As Integer
        Try
            Dim X As MyUDT = DirectCast(obj, MyUDT)
            cmp = Me.Code.CompareTo(X.Code)
            If cmp = 0 Then
                cmp = Me.Name.CompareTo(X.Name)
            End If
            Return cmp
        Catch
            Return 0
        End Try
    End Function
End Structure

[ツリー表示へ]
タイトルRe^2: 構造体配列のソートについて
記事No736
投稿日: 2004/02/20(Fri) 15:09
投稿者タートル
ご教授ありがとうございました。
このやり方だと1パターンの複数キーしかできないのでしょうか?
何パターンか並び替えパターンがある場合って対応できないものでしょうか?

> > 構造体配列を使用して複数キー指定でソートをしたいのですが(DBでいうORDER BY)
>
> 構造体にIComparableインターフェイスを実装しておけば、呼び出し側は、
> 『  Array.Sort(構造体配列変数)  』の1行だけでソートを行えます。
>
>
> Protected Friend Structure MyUDT : Implements System.IComparable
>     Friend Code As Integer, Name As String
>     Friend Sub New(ByVal Code As Integer, ByVal Name As String)
>         Me.Code = Code
>         Me.Name = Name
>     End Sub
>     Private Function CompareTo(ByVal obj As Object) As Integer Implements
System.IComparable.CompareTo
>         Dim cmp As Integer
>         Try
>             Dim X As MyUDT = DirectCast(obj, MyUDT)
>             cmp = Me.Code.CompareTo(X.Code)
>             If cmp = 0 Then
>                 cmp = Me.Name.CompareTo(X.Name)
>             End If
>             Return cmp
>         Catch
>             Return 0
>         End Try
>     End Function
> End Structure

[ツリー表示へ]
タイトルRe^3: 構造体配列のソートについて
記事No737
投稿日: 2004/02/20(Fri) 16:11
投稿者魔界の仮面弁士
> このやり方だと1パターンの複数キーしかできないのでしょうか?
IComparable.CompareTo の中で、複数パターンの処理を実装させてみてください。
あるいはIComparerを用意しておき、それをArray.Sortに指定させるという手も使えます。

[ツリー表示へ]
タイトルRe^4: 構造体配列のソートについて
記事No738
投稿日: 2004/02/20(Fri) 16:45
投稿者タートル
もうしわけありません。
具体的な実装例があると助かります。
よろしくお願いします。

> > このやり方だと1パターンの複数キーしかできないのでしょうか?
> IComparable.CompareTo の中で、複数パターンの処理を実装させてみてください。
> あるいはIComparerを用意しておき、それをArray.Sortに指定させるという手も使えます。

[ツリー表示へ]
タイトルソートのパターンを変更するコード
記事No779
投稿日: 2004/03/18(Thu) 17:53
投稿者特攻隊長まるるう
興味があったのでちょっと触らせてもらいました。
大変勉強になりました。
タートルさん、魔界の仮面弁士さん、ありがとうございます。

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button2.Click
        Dim a(2) As MyUDT
        MyUDT.Pattern = 1
        a(0) = New MyUDT("CCC", "BBB")
        a(1) = New MyUDT("BBB", "AAA")
        a(2) = New MyUDT("A", "GGG")
        Array.Sort(a)
        MyUDT.Pattern = 2
        Array.Sort(a)
    End Sub

    Protected Friend Structure MyUDT : Implements System.IComparable
        Friend Code As String, Name As String
        Shared Pattern As Integer
        Friend Sub New(ByVal Code As String, ByVal Name As String)
            Me.Code = Code
            Me.Name = Name
        End Sub
        Private Overloads Function CompareTo(ByVal obj As Object) As Integer Implements
System.IComparable.CompareTo
            Dim cmp As Integer
            Try
                Dim X As MyUDT = DirectCast(obj, MyUDT)
                Select Case Me.Pattern
                    Case 1
                        cmp = Me.Code.CompareTo(X.Code)
                        If cmp = 0 Then
                            cmp = Me.Name.CompareTo(X.Name)
                        End If
                        Return cmp
                    Case 2
                        cmp = Me.Code.CompareTo(X.Name)
                        If cmp = 0 Then
                            cmp = Me.Name.CompareTo(X.Code)
                        End If
                        Return cmp
                    Case Else
                        cmp = Me.Code.CompareTo(X.Code)
                        If cmp = 0 Then
                            cmp = Me.Name.CompareTo(X.Name)
                        End If
                        Return cmp
                End Select
            Catch
                Return 0
            End Try
        End Function

    End Structure

[ツリー表示へ]