【问题标题】:VB Dictionary with same key more than onceVB字典多次使用相同的键
【发布时间】:2013-10-29 04:19:34
【问题描述】:

一个字典是否可以多次使用同一个键?我环顾四周,答案似乎是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()

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

【问题讨论】:

  • 似乎没有内置功能。您可以做的是制作一个字典,其中包含 List 作为其值的类型。然后,在添加到字典时,您需要检查键是否存在并将值添加到保留同一键的所有值的列表中。
  • reader.Close() 上设置一个休息点,然后将鼠标悬停在allCalls 上,您将能够查看其中的内容。字典键是/必须是唯一的,否则将无法取回正确的数据。使用allCall.ContainsKey 测试密钥是否已经存在。 allCalls(key) = newData 将替换与该键关联的数据。
  • 如果您至少使用 .NET 3.5,则可以使用 Lookup 类。
  • 答案是否定的。在 CSV 文件的第一列中具有唯一值并不罕见。它通常类似于订单 ID。
  • 如果你在谈论Dictionary<Tkey, Tvalue),你永远不能拥有两个相同的键。一旦您尝试添加第二个密钥,就会发生异常,例如“密钥已存在”

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您至少使用 .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
    

    请注意,如果密钥不存在,您不会收到异常。则序列将为空。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-15
      • 2020-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-27
      • 1970-01-01
      相关资源
      最近更新 更多