是否有更好的方式根據條件從哈希表中移除多個項目,而不是先將項目保存在列表中,然後迭代並逐個刪除每個項目?通用列表提供了一個「RemoveAll」方法,我可以傳遞一個匿名函數,但似乎並沒有對HashTable的等效方法。注意:我正在使用.NET框架2.0從循環中移除哈希表中的項目
回答
這真的取決於您的應用程序。如果您的應用程序是多線程的,並且使用.NET 4.0,通常最好使用ReaderWriterLock/ReaderWriterLockSlim
並獲取讀卡器鎖定,構建要刪除的密鑰列表,然後升級到寫入鎖定並執行循環在列表中刪除密鑰。這樣,當您通過Hashtable
來反覆刪除鍵時,其他讀者可以在不被鎖定的情況下訪問它。
現在,如果你可以使用.NET 4.0,那麼ConcurrentDictionary
就很棒了,而且競爭也更少!如果你停留在.NET 2.0中,我推薦Dictionary
,儘管它本身不是你問題的一部分。
UPDATE如果您的申請不多線程,無需鎖定,但你仍然需要建立密鑰列表中,因爲調用remove(),而迭代無效枚舉。所以基本上,你考慮到你對問題的評論是正確的。
謝謝,我正在處理遺留代碼。你的意思是我必須把散列表轉換成字典嗎?即使那麼它將如何解決這個問題呢?它有更好的API來操縱集合嗎? – RKP
@RKP:不,只是微軟的建議,總是喜歡通用集合的原始集合。更高性能,非裝箱等等。但是,如果它是傳統代碼,那麼你只需要使用你所處理的內容:-) –
據我所知。只是迭代你的列表並按照這種方式刪除密鑰有什麼問題?如果你經常這樣做,只需將它變成一個函數...
如果你使用.NET framework 3.5或更高版本,LINQ可能會讓你的目標更容易完成。
不幸的是,LINQ並沒有對序列提供變異操作(即不添加,刪除等)。 –
沒錯,但是你可以創建一個元素只匹配(a)條件的序列的副本。 –
沒錯,儘管實質上你仍然在製作一系列的結果來刪除。簡化查詢過程,但1)make列表2)從列表中逐個刪除所有密鑰 - 仍然是相同的算法。這是主要的觀點。我同意LINQ查詢更容易做出列表。 –
- 1. 從哈希表中刪除項目(java)
- 2. PowerShell哈希表值從循環外的第二個哈希表中刪除
- 3. 無法從哈希表中移除項目
- 4. 從哈希集中刪除項目
- 5. 的循環哈希表C#
- 6. 循環通過陣列從哈希表
- 7. 從哈希映射表中刪除項目
- 8. 從循環中的對象中移除項目
- 9. 從C++ 11範圍'for'循環中移除vector中的項目?
- 10. 試圖循環遍歷哈希中的項目並只返回某些項目
- 11. 刪除循環中的列表項目
- 12. 如何在哈希表的Arraylist中爲for循環生成新的哈希表
- 13. 從php循環中刪除項目
- 14. 過濾Redis哈希條目 - 從哈希或從集合中刪除條目
- 15. 當我循環哈希映射時,如何從ArrayList中獲取所有項目
- 16. 從循環中的列表中刪除項目
- 17. 在通過集合循環時從ObservableCollection中移除項目
- 18. 如何從哈希表中刪除值?
- 19. 從哈希表中刪除數據
- 20. 基於某個值從Redis哈希中刪除多個項目
- 21. 如何從紅寶石哈希中刪除項目?
- 22. 從哈希映射中刪除項目時遇到問題
- 23. 如何循環哈希表在JSP
- 24. Java哈希表,帶while循環
- 25. 從數組中刪除重複項而不使用哈希表
- 26. 從列表視圖中移除項目
- 27. 排除for循環中的項目
- 28. 哈希表中的搜索哈希
- 29. 從列表中foreach循環返回錯誤刪除項目
- 30. 用循環移動列表中的選中項目
你有沒有嘗試過hashtable.Remove方法 – 62071072SP
它是多線程應用程序嗎? –
它不是多線程的,並且可以使用hashtable.remove方法,但是我需要循環兩次,一次找到要刪除的鍵,然後再次循環通過鍵集合以分別刪除每個鍵(沒有任何東西removeRange方法,我可以傳遞一組鍵) – RKP