VB字典与同一个键不止一次

时间:2013-10-20 19:04:40

标签: .net arrays vb.net for-loop dictionary

字典是否可以多次使用相同的密钥?我看了很多,答案似乎是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()

这部分工作正常,但是如果我在添加相同的密钥时覆盖旧数据,我无法告诉你。然而,对我来说似乎违反直觉,它不会引起某种问题。基本上我的目标是能够搜索这个东西以获取密钥并获取所有数组数据,而我无法弄清楚该怎么做。我甚至不知道它是否还在那里所以任何帮助如何使用这些东西都会很棒。

2 个答案:

答案 0 :(得分:0)

如果您至少使用.NET 3.5,则可以使用Lookup类。

  

Lookup<TKey, TElement>类似于Dictionary<TKey, TValue>。该   区别在于Dictionary<TKey, TValue>将键映射到单个   值,而Lookup<TKey, TElement>将键映射到集合   值。

请注意

没有公共构造函数来创建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)})

一个键可以返回零个,一个或多个值:

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

请注意,如果密钥不存在,则不会出现异常。那时的序列将是空的。

答案 1 :(得分:0)

我最终最终使用了ArrayList字典,只是添加了数组。你绝对不能多次存储在同一个键上,但检查它是否存在并添加到arraylist中效果很好