none
Dictionary 使用 Object陣列當 Key RRS feed

  • 問題

  • 各位好,

            '在一 VB 2008 專案中使用 Dictionary(Of Object(), Single())
            'Dictionary 的 Key 是 Object陣列, Value 是 Single陣列.
            '遇到 ContainsKey 問題,
            '另寫下列簡單程式測試:

            Dim Dic As New Dictionary(Of Object(), Single())
            Dim oKey() As Object
            Dim oVal() As Single
    
            oKey = New Object() {"S1", "S2", "S3"}
            oVal = New Single() {12.34, 56.78}
    
            Dic.Add(oKey, oVal)
    
            Debug.Print(Dic.ContainsKey(oKey)) 'True. OK.
    
            '問題: 當在一些程序中取得一樣的 Key 內容時, ContainsKey 卻傳回 False.
            oKey = New Object() {"S1", "S2", "S3"} '和上面一樣的內容,
            Debug.Print(Dic.ContainsKey(oKey)) '卻傳回 False. ??
    

    '請問如何在當 Dictionary 必須使用 Object陣列當 Key 時, 判斷 Key 已存在.

    謝謝!

    2015年1月30日 上午 07:40

解答

  • 當然是 false, 此時比較的是該物件(對你而言就是陣列) 的參考

    所以當你的 oKey 變數指向另一個陣列, 兩個的參考就不一樣了.

    而且, 泛型用 Object 型別實在是一件很奇怪的事


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2015年1月30日 上午 09:04
    版主

所有回覆

  • 當然是 false, 此時比較的是該物件(對你而言就是陣列) 的參考

    所以當你的 oKey 變數指向另一個陣列, 兩個的參考就不一樣了.

    而且, 泛型用 Object 型別實在是一件很奇怪的事


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2015年1月30日 上午 09:04
    版主
  •         '原來如此, 謝謝您的解惑.

            '會使用 Object陣列當 Dictionary 的 Key, 是因為:
            '後續要傳給 DataTable.Rows.Find()
            '該 DataTable 的 PrimaryKey 是 3 個資料欄組成,
            '所以需要傳 Object() 給 .Rows.Find.

            Dim Reader As SqlDataReader
            Dim Dic As New Dictionary(Of Object(), Single())
            Dim oKey() As Object
            Dim Table As DataTable
            Dim Row As DataRow
    
            '省略一些程式...
    
            Do While Reader.Read
                'A資料表某三欄組合對應到 B資料表的 PK.
                '下行取 A資料表某三欄資料到 Object(), 其他欄資料另有其他處理.
                oKey = New Object() {Reader.GetString(0), Reader.GetString(2), Reader.GetString(4)}
    
                '一些程式需要借助 Dictionary 的特性.
    
                If Dic.ContainsKey(oKey) Then 'TODO: 問題: 永遠都是 False!
                    '省略一些程式...
                Else
                    '省略一些程式...
                End If
    
                '一些運算後, 以 Single陣列 存入 Dic(oKey) 的 Value. 
            Loop
    
            '省略一些程式...
    
            For Each KVP In Dic
                Row = Table.Rows.Find(KVP.Key) 'B資料表PK有三欄, 要傳 Object陣列
                '因前面 ContainsKey 判斷非預期, 而使得 KVP.Key 會有重複的情況,
                '因此後面運算結果錯誤.
    
                '另取 KVP.Value 做一些資料處理... 
                '省略一些程式...
            Next
    

            '週一上班時, 試著改寫成使用 Dictionary(Of String, Single())
            '後續再用 Strings.Split、Array.ConvertAll 轉成 Object() 餵給 Table.Rows.Find() 吧(?)

    2015年1月30日 下午 03:45