2013-10-09 2 views
0
var dd = new Dictionary<Guid, object>(); //readonly in my real code 
dd.Add(Guid.NewGuid() , 'a'); 
dd.Add(Guid.NewGuid() , 'a'); 
dd.Add(Guid.NewGuid() , 'a'); 
var randone = dd.ElementAt(new Random(dd.Count()).Next(dd.Count)); 

가능한 한 빨리 dd에서 무작위 값을 얻고 싶습니다 (매 ms 카운트). 그러나 나는 위의 샘플로 그렇게하지 않을 것이라고 확신합니다. 임의의 KeyValuePair를 얻기 위해 어떻게 randone을 다시 사용할 수 있습니까? 실제 코드에서 키는 사실 GUID이지만 값은 사용자 지정 POCO입니다.사전의 임의 값입니까?

+5

아이템 수를 '랜덤'으로 시딩하면 결정적으로 * 랜덤 결과가됩니다. –

답변

2

List<T>에 모든 키를 보관할 수 있으면 0과 List.Count 사이의 난수를 선택할 수 있습니다. 해당 번호 (간단한 조회)를 사용하여 목록에 색인을 작성한 다음이를 사용하여 사전에 색인을 생성하십시오.

+0

실제 코드에는 수천 개의 k/v 쌍이있는 많은 사전이 있으므로 목록의 모든 키를 복제하지 않으면 추가 오버 헤드가 추가됩니까? – Snowy

+0

속도와 관련하여 트레이드 오프입니다. 더 많은 메모리를 차지한다는면에서 추가 오버 헤드가 추가되지만, 속도가 가장 중요한 문제라면, 이것이 최선의 선택입니다. 나는 이것이 추가 할 수있는 메모리 오버 헤드의 양이 어쨌든 매우 미미할 것이라고 주장한다. – BFree

관련 문제