2013-10-20 114 views
0

字典是否可以多次使用同一个密钥?我环顾四周,答案似乎是YesNo。我从csv文件中读取cc数字并将它们添加到字典中。大多数表示“否”的帖子通常表示多次添加一个键会引发异常。这将是错误的,因为我没有遇到这个问题。
基本上我有这个词典具有相同密钥的VB字典不止一次

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() 

这部分工作得很好,但据我好像覆盖我的旧数据,当我添加我无法告诉你的相同密钥。不过,这对我来说似乎并不直观,不会造成某种问题。基本上我的目标是能够搜索这个东西的密钥,并获得所有的数组数据,我不知道该怎么做。我甚至不知道它是否还在那里,所以如何处理这些事情的任何帮助都会很好。

+1

似乎没有为此设置内置功能。你可以做的是制作一个字典,它有一个List作为其值的类型。然后,当添加到字典中时,您需要检查密钥的存在并将该值添加到保留相同密钥的所有值的列表中。 –

+1

在'reader.Close()'上设置一个中断,然后将鼠标放在'allCalls'上,您将能够看到内容。字典键必须是唯一的,否则将无法获得正确的数据。使用'allCall.ContainsKey'来测试一个密钥是否已经存在。 'allCalls(key)= newData'将替换与该键相关的数据。 – Plutonix

+1

如果您至少使用.NET 3.5,则可以使用['Lookup'](http://msdn.microsoft.com/zh-cn/library/bb460184.aspx)类。 –

回答

0

我最终结束了使用一个ArrayList字典,并只是添加数组。您绝对不能在同一个密钥上存储多次,但检查它是否存在并添加到数组列表中可以很好地工作

0

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

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

没有公共构造创建Lookup<TKey, TElement>的新实例。另外,Lookup<TKey, TElement>对象是不可变的,也就是说,创建对象后,您不能添加或删除Lookup<TKey, TElement>对象中的元素或键。

但是你可以使用Enumerable.ToLookup:如果该键不

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

注意,你没有得到一个异常:

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)}) 

一键可以返回零,一个或多个值存在。那么排序将是空的。

相关问题