조건에 따라 해시 테이블에서 여러 항목을 제거하는 더 좋은 방법이 있습니다. 목록에서 키를 먼저 저장 한 다음 반복하여 각 항목을 하나씩 제거하는 것 외에 다른 방법이 있습니까? Generic리스트는 익명 함수를 전달할 수있는 "RemoveAll"메쏘드를 제공하지만, HashTable에 상응하는 접근법이없는 것으로 보인다. 참고 : .NET Framework 2.0을 사용 중입니다.루프에서 Hashtable의 항목 제거
답변
이것은 실제로 응용 프로그램에 따라 다릅니다. 응용 프로그램이 멀티 스레드이고 ,, .NET 4.0 이전 인 경우 일반적으로 ReaderWriterLock/ReaderWriterLockSlim
을 사용하고 판독기 잠금을 가져오고 제거하려는 키 목록을 작성한 다음 쓰기 잠금으로 업그레이드하고 루프를 수행하는 것이 좋습니다 목록에서 키를 제거하십시오. 이렇게하면 키를 제거하기 위해 Hashtable
을 반복하면서 다른 판독기는 잠그지 않고 액세스 할 수 있습니다.
이제 .NET 4.0을 사용할 수 있다면 ConcurrentDictionary
은 훌륭하고 경합이 훨씬 적습니다! .NET 2.0에 머물러 있다면 질문 자체가 아니더라도 Dictionary
을 권하고 싶습니다. 응용 프로그램 인 경우
UPDATE는하지 멀티 스레드, 필요 잠금 없습니다 만 반복하는이 열거를 무효화하면서() 제거를 호출하기 때문에 여전히 키의 목록을 작성해야합니다. 그래서 기본적으로, 당신은 질문에 당신의 의견을 주면 올바르게하고 있습니다.
감사합니다. 저는 레거시 코드를 작성하고 있습니다. 해시 테이블을 사전에 숨겨야한다는 뜻인가요? 그렇다면이 문제를 어떻게 해결할 것인가? 컬렉션을 조작하는 데 더 좋은 API가 있습니까? – RKP
@RKP : 아니요, 일반 컬렉션을 항상 원래 컬렉션으로 선호하는 Microsoft 권장 사항입니다. 보다 성능이 뛰어나고, 복싱이 아닌 등. 그러나 레거시 코드 인 경우 처리 한 내용을 사용해야합니다. –
내가 아는 한 멀지 않습니다. 어쨌든 목록을 반복하고 키를 제거하는 것이 잘못된 것입니까? 자주해야 할 일이라면 그냥 함수로 만들어야합니다 ...
.NET Framework 3.5 이상을 사용하는 경우 LINQ를 사용하면 훨씬 쉽게 목표를 달성 할 수 있습니다.
LINQ는 불행히도 시퀀스에 변형 작업을 제공하지 않습니다 (즉, 추가, 제거 등 없음). –
그렇지만 요소가 (a) 조건과 만 일치하는 시퀀스 복사본을 만들 수 있습니다. –
사실, 본질적으로 여전히 제거 할 일련의 결과를 만들고 있습니다. 쿼리 프로세스를 간소화하지만 1) 목록 작성 2) 목록에서 하나씩 모든 키를 제거합니다. 여전히 동일한 알고리즘입니다. 그것이 주요 포인트였습니다. 나는 LINQ 쿼리가리스트를 만들기 쉽다고 동의합니다. –
- 1. C# - while 루프에서 사전에서 항목 제거
- 2. 루프에서 컨트롤 제거
- 3. ListView에서 선택한 항목 제거
- 4. NSMutableArray 중복 항목 제거
- 5. 목록에서 항목 제거
- 6. JQuery - 쿠키에서 항목 제거
- 7. 루프의 목록에서 항목 제거
- 8. LINQ : IQueryable에서 항목 제거
- 9. jCarousel 플러그인에서 항목 제거
- 10. Regex로 사전 항목 제거
- 11. 컬렉션에서 항목 제거 (NHibernate)
- 12. ListView에서 선택한 항목 제거
- 13. ListBox에서 빈 항목 제거
- 14. jQuery 객체에서 항목 제거
- 15. 중복 항목 제거
- 16. 자바 xml 항목 제거
- 17. SQL에서 중복 항목 제거
- 18. Gridview 항목 제거
- 19. 목록에서 항목 제거 - C#
- 20. jQuery 배열에서 항목 제거
- 21. ListBox 항목 제거
- 22. 카트에서 항목 제거
- 23. 사전에서 임의로 항목 제거
- 24. .net hashtable의 크기 찾기
- 25. HashTable의 여러 필드
- 26. 부작용없이 for 루프에서 항목을 제거 하시겠습니까?
- 27. For 루프에서 첫 번째 항목 가져 오기
- 28. 캐시에서 특정 항목 제거 (ASP.NET)
- 29. 중복 항목 제거, scala way
- 30. QListView에서 선택한 항목 목록 제거
해시 테이블을 사용해 보셨습니까? 삭제 방법 – 62071072SP
멀티 스레드 응용 프로그램입니까? –
멀티 스레드가 아니며 hashtable.remove 메서드를 사용할 수 있지만 두 번 반복해야합니다. 한 번 제거해야 할 키를 찾은 다음 키 컬렉션을 반복하여 각각 별도로 하나씩 제거합니다. removeRange 메서드 어디에서 키 배열을 전달할 수 있습니까?) – RKP