0

辞書が同じキーを複数回持つことは可能ですか? 私はかなり周りを見回しましたが、答えはYesNoのようです。csv ファイルから cc 番号を読み込んで辞書に追加しています。いいえと言うほとんどの投稿は、通常、キーを複数回追加すると例外がスローされることを示しています。私はこの問題に遭遇していないので、これは間違っているに違いありません。
基本的に私はこの辞書を持っています

Dim allCalls As New Dictionary(Of String, Array)

そして、私はこのように入力しています

 Dim Path As String = My.Application.Info.DirectoryPath & "\Calls.txt"
    Dim reader As StreamReader = My.Computer.FileSystem.OpenTextFileReader(Path)
    Dim parts() As String
    Dim lines() As String = IO.File.ReadAllLines(Path)

    Array.Sort(lines)
    For x As Integer = 0 To lines.GetUpperBound(0)
        parts = lines(x).Split(CChar(","))
        Dim data(1) As String
        data(0) = parts(2)
        data(1) = parts(5)
        allCalls.Add(parts(1), data)
    Next

    reader.Close()

この部分は問題なく動作していますが、同じキーを追加したときに古いデータが上書きされているかどうかはわかりません。しかし、それが何らかの問題を引き起こさないというのは直感に反しているように思えます。基本的に、私の目標は、このことをキーで検索し、すべての配列データを取得できるようにすることですが、どうすればよいかわかりません。それがまだそこにあるかどうかさえ本当にわからないので、これらのものをどのように扱うかについての助けは素晴らしいでしょう.

4

2 に答える 2

0

少なくとも .NET 3.5 を使用している場合は、Lookupクラスを使用できます。

ALookup<TKey, TElement>は に似ていDictionary<TKey, TValue>ます。違いは、 aDictionary<TKey, TValue>はキーを単一の値にLookup<TKey, TElement>マップするのに対し、 a はキーを値のコレクションにマップすることです。

ノート

の新しいインスタンスを作成するパブリック コンストラクターはありませんLookup<TKey, TElement>。さらに、Lookup<TKey, TElement>オブジェクトは不変です。つまり、オブジェクトの作成後に要素やキーを追加したり、オブジェクトから削除したりすることはできませんLookup<TKey, TElement>

しかし、あなたは使うことができますEnumerable.ToLookup

Dim allCalls As ILookup(Of String, String()) =
    (From line In IO.File.ReadAllLines(Path)
     Order By line
     Let tokens = line.Split(","c)
     Where tokens.Length >= 6).
ToLookup(Function(p) p.tokens(1), Function(p) {p.tokens(2), p.tokens(5)})

1 つのキーは、ゼロ、1 つ、または複数の値を返すことができます。

Dim calls = allCalls("Key")
For Each c As String In calls
    ' ... '
Next

キーが存在しない場合、例外は発生しないことに注意してください。その場合、シーケンスは空になります。

于 2013-10-20T19:29:59.447 に答える