Как удалить все элементы из словаря?

Я использую следующий код для удаления всех элементов из словаря:

internal static void RemoveAllSourceFiles()
        {
            foreach (byte key in taggings.Keys)
            {
                taggings.Remove(key);
            }
        }

Но, к сожалению, это не работает, потому что бросается InvalidOperationException. Я знаю, это потому, что коллекция модифицируется во время итерации по ней, но как я могу ее изменить?

Ответ 1

Более простой (и гораздо более эффективный) подход:

taggings.Clear();

и да, ошибка заключается в том, что изменение данных преднамеренно прерывает итераторы.

Ответ 2

Попробуйте вместо этого использовать Очистить.

internal static void RemoveAllSourceFiles()
        {
           taggings.Clear();
        }

Обновление: И, как отметил Марк, вы не можете продолжать повторять сборку во время ее изменения, потому что итератор безвозвратно аннулирован. Пожалуйста, прочитайте ответ на этот вопрос SO для деталей.

Почему перечисление через коллекцию генерирует исключение, но цикл через его элементы не работает

Ответ 4

Чтобы сделать то, что вы хотите сделать, вам понадобится повторить итерацию ключей в обратном порядке, таким образом вы не будете изменять массив в том порядке, в котором он пытается вернуться к вам.

Либо это, либо используйте .Clear()

Ответ 5

Как сказано, перечислитель по умолчанию .NET не поддерживает изменения коллекции при перечислении. В вашем случае используйте Clear.

Если вам нужен лучший контроль над удалением, используйте linq:

var deletionList = (from tag in taggings where <where clause> select tag.Key).ToArray();
foreach(var key in deletionList)
{
   taggings.Remove(key);
}

Метод расширения ToArray() будет перечислять запрос LINQ и создавать экземпляр массива, хранящего результаты. Этот массив можно безопасно перечислить позже, чтобы удалить содержащиеся в исходном словаре элементы.

Ответ 6

Я знаю, что это старый вопрос, но для любого, кто ищет ответ, вот несколько вариантов:

  • Чтобы .remove property list() а затем использовать .remove property.
  • Сделать его ноль/ничего и переустановить его?
  • Зацикливаться вместо foreach?
while Dict.Count()
  clDictObject oBj = Dict.Keys.ElementAt(dict.Count -1);
  Dict.Remove(oBj)
end while