Удаление элементов из Hashtable в цикле - PullRequest
3 голосов
/ 14 сентября 2011

Есть ли лучший способ удалить несколько элементов из хеш-таблицы на основе условия, кроме сохранения сначала ключей в списке, а затем итерации по ним и удаления каждого элемента по одному?Общий список предоставляет метод «RemoveAll», в который я могу передать анонимную функцию, но, похоже, для HashTable нет эквивалентного подхода.примечание: я использую .NET Framework 2.0

Ответы [ 2 ]

0 голосов
/ 14 сентября 2011

Это действительно зависит от вашего приложения. Если ваше приложение является многопоточным и pre .NET 4.0, обычно лучше использовать ReaderWriterLock/ReaderWriterLockSlim и получить блокировку считывателя, создать список ключей, которые вы хотите удалить, а затем выполнить обновление до записи. заблокировать и выполнить цикл в списке, чтобы удалить ключи. Таким образом, пока вы перебираете ключи Hashtable для удаления, другие читатели могут получить к ним доступ без блокировки.

Теперь, если вы можете добраться до .NET 4.0, ConcurrentDictionary великолепен и имеет гораздо меньше споров! Если вы остаетесь в .NET 2.0, я бы порекомендовал Dictionary, хотя это само по себе не является частью вашего вопроса.

ОБНОВЛЕНИЕ Если ваше приложение не многопоточное, не нужно блокировать, но вам все равно нужно создать список ключей, потому что вызов Remove () во время итерации делает недействительным переписчик. В общем, вы делаете это правильно, учитывая ваш комментарий к вопросу.

0 голосов
/ 14 сентября 2011

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

Если бы вы использовали .NET Framework 3.5 или выше, LINQ, вероятно, значительно облегчила бы вашу цель.

...