同じキーワードを含む配列(構造体)のソートを上手く実行するには?

解決


なっぷ  2006-09-02 23:53:20  No: 96467

言語:Visual Basic 2005

以下に示すコードにより、構造体のソートを行いましたが、1回目と2回目で異なる結果となってしまい困っています。

具体的には、"東証1部"という要素を持っている構造体変数が2つありますが、.netのソートは同じ変数がある場合、入れ替えをやってしまうようなのです。(間違っていたらすみません。)

下記のコードで自前のソートクラスmyCompareのところでコメントを入れたところを-1にすれば、希望の動作を実現できると思っていましたが、この場合はなぜかエラーとなってしまい、お手上げ状態で困っています。

本件どなたかご存知の方がおられましたら教えていただけないでしょうか。
よろしくお願いします。

Public Class Class1

    Public Shared HashTB As New Hashtable
    Public Shared SortKey As String

    Public Structure myStockCode

        Public StockCode As Integer
        Public StockName As String
        Public Market As String
        Public Num_Market As Integer

    End Structure

    Private Class myCompare
        Implements IComparer

        Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
            If CType(x, myStockCode).Num_Market = CType(y, myStockCode).Num_Market Then
                Return 0 '<--- ここを-1としたいがエラーとなってできない
            End If
            If CType(x, myStockCode).Num_Market < CType(y, myStockCode).Num_Market Then
                Return -1
            Else
                Return 1
            End If
        End Function
    End Class

    Public StockCode(3) As myStockCode

    Public Sub New()

        StockCode(0).StockCode = 1378
        StockCode(0).StockName = "雪国"
        StockCode(0).Market = "東証1部"

        StockCode(1).StockCode = 2683
        StockCode(1).StockName = "魚喜"
        StockCode(1).Market = "東証2部"

        StockCode(2).StockCode = 2742
        StockCode(2).StockName = "ハローズ"
        StockCode(2).Market = "JASD"

        StockCode(3).StockCode = 1301
        StockCode(3).StockName = "極洋"
        StockCode(3).Market = "東証1部"

        HashTB("東証1部") = 1
        HashTB("東証2部") = 2
        HashTB("JASD") = 3
        Dim i As Integer
        For i = 0 To 3
            StockCode(i).Num_Market = CType(HashTB(StockCode(i).Market), Integer)
        Next

    End Sub

    Public Sub show1()
        Dim objmyCompare As New myCompare
        Dim outstr As String
        Dim i As Integer

        '1回目のソート
        outstr = ""
        System.Array.Sort(StockCode, objmyCompare)
        For i = 0 To 3
            outstr = outstr & StockCode(i).StockCode & " " & StockCode(i).StockName & " " & StockCode(i).Market & " " & StockCode(i).Num_Market & vbCrLf
        Next
        outstr += vbCrLf

        '2回目のソート
        System.Array.Sort(StockCode, objmyCompare)
        For i = 0 To 3
            outstr = outstr & StockCode(i).StockCode & " " & StockCode(i).StockName & " " & StockCode(i).Market & " " & StockCode(i).Num_Market & vbCrLf
        Next
        outstr += vbCrLf

        '3回目のソート
        System.Array.Sort(StockCode, objmyCompare)
        For i = 0 To 3
            outstr = outstr & StockCode(i).StockCode & " " & StockCode(i).StockName & " " & StockCode(i).Market & " " & StockCode(i).Num_Market & vbCrLf
        Next
        outstr += vbCrLf

        MsgBox(outstr)
    End Sub

End Class


Blue  2006-09-03 02:53:42  No: 96468

http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=691978&SiteID=7
で話が進んでいるようです。

※マルチポスト(同じ質問を違う掲示板にする行為)は一般的にはマナー違反で嫌われる行為です。
やってしまったことはしょうがないので、きちんとどちらの掲示板にもどのようにして解決に
いたったのかを報告してください。(これをやらない輩が多いから、嫌われるわけで)


なっぷ  2006-09-03 09:13:25  No: 96469

すみません。失礼いたしました。
今後は気をつけたいと思います。

Blueさんにつけていただいたリンクで解決いたしました。
お騒がせしました。


なっぷ  2006-09-03 09:13:53  No: 96470

解決しました。


Blue  2006-09-03 11:58:04  No: 96471

>きちんとどちらの掲示板にもどのようにして解決にいたったのかを報告してください
「リンク先を見なくても、どのように解決したのか、この掲示板だけで完結させてください」
ということでしたが。
(リンク先をいちいち見に行ってくださいってのはダメ。参照できなくなったりするし、面倒でしょ?)


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加