2013-10-20 84 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)}) 

一鍵可以返回零,一個或多個值存在。那麼排序將是空的。

相關問題