おじょろじょの、「河童の話は聞かないで。」

プログラムに関しての覚え書きや、仕事のぼやきなど。。

VB.NETのディクショナリーオブジェクトでハマったよ。

とある処理で、各タイプごとの集計するとき、

データテーブルがとっても使いづらかったのでディクショナリーを使ってみた。

ハマったソース

  ディクショナリー1
        Dim dc1 As New Dictionary(Of Integer, Dictionary(Of Integer, String))
  ディクショナリー2
        Dim dc2 As New Dictionary(Of Integer, Dictionary(Of Integer, String))

        'ディクショナリーをセット
        For iDcset As Integer = 1 To 3
            Dim dcTemp As New Dictionary(Of Integer, String)
            'キーをセット
            For iKeyset As Integer = 1 To 3
                dcTemp.Add(iKeyset, 0)
            Next
            dc1.Add(iDcset.ToString, dcTemp)
            dc2.Add(iDcset.ToString, dcTemp)
        Next

        'バリューを入れる
        dc1(1)(1) = "A"
        dc1(1)(2) = "B"
        dc1(2)(1) = "C"
        dc1(2)(2) = "D"
        dc1(3)(1) = "E"
        dc1(3)(2) = "F"

        dc2(1)(1) = "1"
        dc2(1)(2) = "2"
        dc2(2)(1) = "3"
        dc2(2)(2) = "4"
        dc2(3)(1) = "5"
        dc2(3)(2) = "6"

  ’出力
        Debug.WriteLine("ディクショナリー1: 値" & dc1(1)(1))
        Debug.WriteLine("ディクショナリー1: 値" & dc1(1)(2))
        Debug.WriteLine("ディクショナリー1: 値" & dc1(2)(1))
        Debug.WriteLine("ディクショナリー1: 値" & dc1(2)(2))
        Debug.WriteLine("ディクショナリー1: 値" & dc1(3)(1))
        Debug.WriteLine("ディクショナリー1: 値" & dc1(3)(2))

        Debug.WriteLine("ディクショナリー2: 値" & dc2(1)(1))
        Debug.WriteLine("ディクショナリー2: 値" & dc2(1)(2))
        Debug.WriteLine("ディクショナリー2: 値" & dc2(2)(1))
        Debug.WriteLine("ディクショナリー2: 値" & dc2(2)(2))
        Debug.WriteLine("ディクショナリー2: 値" & dc2(3)(1))
        Debug.WriteLine("ディクショナリー2: 値" & dc2(3)(2))
結果

ディクショナリー1: 値1
ディクショナリー1: 値2
ディクショナリー1: 値3
ディクショナリー1: 値4
ディクショナリー1: 値5
ディクショナリー1: 値6


ディクショナリー2: 値1
ディクショナリー2: 値2
ディクショナリー2: 値3
ディクショナリー2: 値4
ディクショナリー2: 値5
ディクショナリー2: 値6

 

されてる。。

犯人は

        'ディクショナリーをセット
        For iDcset As Integer = 1 To 3
            Dim dcTemp As New Dictionary(Of Integer, String)
   ↑こいつ!

まだまだ素人のわたしには、いまいち理解できず、

こいつが参照しちゃってる??というのか、なんなのか、、、

なので、もうひとつ作ってやった。

        'ディクショナリーをセット
        For iDcset As Integer = 1 To 3
            Dim dcTemp1 As New Dictionary(Of Integer, String)
            Dim dcTemp2 As New Dictionary(Of Integer, String)
            'キーをセット
            For iKeyset As Integer = 1 To 3
                dcTemp1.Add(iKeyset, 0)
                dcTemp2.Add(iKeyset, 0)
            Next
            dc1.Add(iDcset.ToString, dcTemp1)
            dc2.Add(iDcset.ToString, dcTemp2)
        Next

なんか嫌だよーーー。