2016-07-28 2 views
0

요소를 추가 할 ConcurrentDictionary가 있습니다.ConcurrentDictionary 값을 키로 반복

키가 고유하지 않으며 여러 값을 반영 할 수 있습니다.

  1. 는 내가 다음에 "다음"문에 값
  2. 컴파일러 충돌의 목록을 얻으려면 키를 기준으로 값을 반복
  3. 그들의 고유 한 이름을 얻기 위해 키를 반복 오류 :

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

그래서, 난 (문자열의) 키가 있다면, 어떻게 그 키와 관련된 값을받을 수 있나요?

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 

UPDATE :

나는 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

코드는 사전의 첫 번째 항목 만 저장합니다 (LOS ANGELES, "black"). TryAdd에 대한 다른 모든 호출은'LOS ANGELES '키가 이미 존재하기 때문에'false'를 반환합니다. – Jehof

+0

것은 첫 번째 값을 저장하는 것이 아닙니다. dict.values ​​() 위로 마우스를 가져 가면 문제없이 모든 값을 반환하지만 키가 고유해야한다는 점에서 옳은 것입니다. – Matth3w

+0

그래서 ConcurrentDictionary (비 고유 키 포함)에서 List로 갔습니까? – Paparazzi

답변

1

dict.Values ​​(int) 메서드에 전달되는 매개 변수는 키가 아닌 요소의 인덱스입니다. 당신이 키 표준시로 값을 ADRESS하려면 Jehof 이미 그의 주석에서 언급 한 바와 같이, 그러나

For Each values In dict(stKeys) 

를 사용하여, 당신은 ConcurrentDictionary 재치 하 비 고유 키를 가질 수 없습니다. 첫 번째 요소 만 추가하고 다른 호출은 실패합니다.

+0

불행합니다. 필자는 실제로 잃어 버릴 여유가없는 퍼포먼스를 희생해야만했다. 그리고 필자가 찾고 있던 기능을 허용 한 사실 이후에 정렬을 처리 할 때 ConcurrentDictionary를 NameValueCollection으로 변환해야했다. – Matth3w

+0

나는 나의 "해결책"을 보여주기 위해 나의 대답을 수정했다. 내가하고 싶은 일을하는 다른 많은 양의 동시적인 방법이 있는가? – Matth3w

+0

솔직히 말하면 컬렉션에 올 때 실제로 전문가가 아닙니다. MSDN에서이 가이드가 도움이 될 것 같습니다 : [link] (https://msdn.microsoft.com/en-us/library/6tc79sx1 (v = vs.110) .aspx) 네가 추천하는 것은 NameValueCollection이지만 더 빠른 방법은없는 것처럼 보인다. 어쩌면 필요한 컬렉션을 제공하는 외부 라이브러리가있을 수 있습니다. 그렇지 않다면 NameValueCollection을 고수해야 할 것입니다. 이미 말했듯이 자신의 것을 쓰십시오 ... – zockDoc