2016-07-28 62 views
0

我有一個我正在向其中添加元素的ConcurrentDictionary。通過密鑰對ConcurrentDictionary值進行迭代

關鍵不是唯一的,並可能反映多個值。

  1. 我通過按鍵進行迭代,讓他們的唯一的名稱
  2. 我通過鍵的值重複,以獲得與下面的「下一步」語句值
  3. 編譯器崩潰的列表錯誤:

Additional information: Conversion from string "LOS ANGELES" to type 'Integer' is not valid.

所以,如果我有(一個String)的關鍵,我怎麼能得到與該鍵關聯的值?

Dim dict As New ConcurrentDictionary(Of String, String) 
    dict.TryAdd("LOS ANGELES", "black") 

    dict.TryAdd("LOS ANGELES", "yellow") 
    dict.TryAdd("LOS ANGELES", "blue") 
    dict.TryAdd("LOS ANGELES", "orange") 
    dict.TryAdd("LOS ANGELES", "yellow") 
    dict.TryAdd("LOS ANGELES", "yellow") 
    dict.TryAdd("LOS ANGELES", "yellow") 
    dict.TryAdd("LOS ANGELES", "yellow") 
    dict.TryAdd("LOS ANGELES", "orange") 


    For Each stKeys As String In dict.Keys 
     If stKeys <> Nothing Then 
      For Each values In dict.Values(stKeys) 
       If values <> Nothing Then 
         Debug.Print(values.ToString) 
       End If 
      Next 
     End If 
    Next 

更新:我如何解決了這個問題:

我用了一個列表,傳遞一個結構給它,以代替鎖定ConcurrentDictionary的,並在那年底,我整理這些項目成NameValueCollection中,像這樣:

Structure structCities 
      CityName as String 
      vColor as string 
End Structure 

DIM dataList as new List(of structCities) 
DIM vData as new structCities 

with vData 
    .CityName = "LOS ANGELES" 
    .vColor = "black" 
end with: dataList.add(vData) 

with vData 
    .CityName = "LOS ANGELES" 
    .vColor = "black" 
end with: dataList.add(vData) 

with vData 
    .CityName = "LOS ANGELES" 
    .vColor = "black" 
end with: dataList.add(vData) 

with vData 
    .CityName = "LOS ANGELES" 
    .vColor = "black" 
end with: dataList.add(vData) 

with vData 
    .CityName = "LOS ANGELES" 
    .vColor = "yellow" 
end with: dataList.add(vData) 

Dim dict As New NameValueCollection 
For Each c In dataList 
     dict.Add(c.CityName, c.vColor) 
Next 
+1

你的代碼將只存儲字典中的第一項(洛杉磯,「黑色」)。所有其他對'TryAdd'的調用將返回'false',因爲關鍵的LOS ANGELES已經存在。 – Jehof

+0

事情是,它不只是存儲第一個值。當你把鼠標放在dict.values()上時,它會返回每個值,但沒有問題,但是你說的鍵必須是唯一的。 – Matth3w

+0

所以你從ConcurrentDictionary(帶有非唯一鍵)到List? – Paparazzi

回答

1

傳遞到dict.Values的參數(int)方法是元素的索引,而不是鍵。如果你想解決由IST鍵的值,使用

For Each values In dict(stKeys) 

然而,隨着Jehof在他的評論中已經提到的,你不能有一個ConcurrentDictionary機智公頃非唯一的密鑰。它只會添加第一個元素,其他的調用將失敗。

+0

這很不幸。我不得不犧牲性能,我真的無法承受損失,並且在事實之後處理排序時,將ConcurrentDictionary轉換爲NameValueCollection,這讓我可以使用我正在尋找的功能,但成本非常高。 – Matth3w

+0

我修改了我的答案,以顯示我的「解決方案」,有沒有其他高容量,併發的方式來做我想做的事情? – Matth3w

+0

說實話,我在收藏時並不是真正的專家。本指南在MSDN看起來有幫助: [鏈接](https://msdn.microsoft.com/en-us/library/6tc79sx1(v = vs。110).aspx) 它推薦給你的東西是一個NameValueCollection,但似乎沒有更快的方式。也許有一些外部庫提供你需要的集合。如果沒有,你將不得不堅持使用NameValueCollection,或者,如你所說,寫你自己的... – zockDoc