Подтвердить что ты не робот

Какой лучший способ установить все значения в словаре С# <string, bool>?

Какой лучший способ установить все значения в словаре С#?

Вот что я делаю сейчас, но я уверен, что есть лучший/более чистый способ сделать это:

Dictionary<string,bool> dict = GetDictionary();
var keys = dict.Keys.ToList();
for (int i = 0; i < keys.Count; i++)
{
    dict[keys[i]] = false;
}

Я пробовал другие способы с помощью foreach, но у меня были ошибки.

4b9b3361

Ответ 1

Это разумный подход, хотя я бы предпочел:

foreach (var key in dict.Keys.ToList())
{
    dict[key] = false;
}

Вызов ToList() делает эту работу, так как она вытягивает и (временно) сохраняет список ключей, поэтому итерация работает.

Ответ 2

Однострочное решение:

dict = dict.ToDictionary(p => p.Key, p => false);

Ответ 3

Если вы не используете tri-state bools, вы можете использовать HashSet<string> и вызвать Clear(), чтобы установить значения в значение "false".

Ответ 4

Я описал разницу между решениями Билли и Рида. Polaris878, хорошо помните результаты и помните, что преждевременная оптимизация - это корень всего зла; -)

Я переписал решения в VB (потому что я сейчас программирую на этом языке) и использовал int-ключи (для простоты), в противном случае это тот же самый код. Я запустил код со словарем в 10 миллионов записей со значением "true" для каждой записи.

Оригинальное решение Billy Witch Doctor:

Dim keys = dict.Keys.ToList
For i = 0 To keys.Count - 1
    dict(keys(i)) = False
Next

Истекшее миллисекунды: 415

Решение Рида Копси:

For Each key In dict.Keys.ToList
    dict(key) = False
Next

Истекшие миллисекунды: 395

Итак, в этом случае foreach на самом деле быстрее.

Ответ 5

Я не уверен, что это лучший способ, но я смотрел что-то на одной строке, и это сработало для меня.

mydict.Keys.ToList().ForEach(k => mydict[k] = false);

Ответ 6

Вы можете просто вытащить ToList() и выполнить итерацию непосредственно над элементами словаря

Dictionary<string, bool> dict = GetDictionary();
foreach (var pair in dict) 
{
    dict[pair.Key] = false;
}