2013-10-09 3 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 как можно быстрее (каждый подсчет мс), но я уверен, что не делаю этого с приведенным выше образцом. Как можно переделать randone для получения случайного ключа KeyValuePair? В фактическом коде ключ на самом деле является идентификатором GUID, но значением является пользовательский POCO.Случайное значение из словаря?

+5

Посещение 'Random' с количеством элементов приведет вас к определенному результату * не * случайному результату. –

ответ

2

Если вы можете сохранить все ключи в List<T>, вы можете просто выбрать случайное число от 0 до List.Count. Индексируйте в список, используя это число (простой поиск), а затем используйте его для индексации в словаре.

+0

В моем фактическом коде много словарей, каждый из которых содержит тысячи пар k/v, так что бы не дублировать все ключи в списке, чтобы добавить дополнительные накладные расходы? – Snowy

+0

Это компромисс, память для скорости. Это добавит дополнительные накладные расходы с точки зрения увеличения объема памяти, но если скорость - это ваша проблема номер один, то это ваш лучший вариант. Я бы сказал, что объем накладных расходов памяти, которые это может добавить, вероятно, очень минимален. – BFree

Смежные вопросы