2011-09-14 12 views
3

조건에 따라 해시 테이블에서 여러 항목을 제거하는 더 좋은 방법이 있습니다. 목록에서 키를 먼저 저장 한 다음 반복하여 각 항목을 하나씩 제거하는 것 외에 다른 방법이 있습니까? Generic리스트는 익명 함수를 전달할 수있는 "RemoveAll"메쏘드를 제공하지만, HashTable에 상응하는 접근법이없는 것으로 보인다. 참고 : .NET Framework 2.0을 사용 중입니다.루프에서 Hashtable의 항목 제거

+0

해시 테이블을 사용해 보셨습니까? 삭제 방법 – 62071072SP

+0

멀티 스레드 응용 프로그램입니까? –

+0

멀티 스레드가 아니며 hashtable.remove 메서드를 사용할 수 있지만 두 번 반복해야합니다. 한 번 제거해야 할 키를 찾은 다음 키 컬렉션을 반복하여 각각 별도로 하나씩 제거합니다. removeRange 메서드 어디에서 키 배열을 전달할 수 있습니까?) – RKP

답변

0

이것은 실제로 응용 프로그램에 따라 다릅니다. 응용 프로그램이 멀티 스레드이고 ,, .NET 4.0 이전 인 경우 일반적으로 ReaderWriterLock/ReaderWriterLockSlim을 사용하고 판독기 잠금을 가져오고 제거하려는 키 목록을 작성한 다음 쓰기 잠금으로 업그레이드하고 루프를 수행하는 것이 좋습니다 목록에서 키를 제거하십시오. 이렇게하면 키를 제거하기 위해 Hashtable을 반복하면서 다른 판독기는 잠그지 않고 액세스 할 수 있습니다.

이제 .NET 4.0을 사용할 수 있다면 ConcurrentDictionary은 훌륭하고 경합이 훨씬 적습니다! .NET 2.0에 머물러 있다면 질문 자체가 아니더라도 Dictionary을 권하고 싶습니다. 응용 프로그램 인 경우

UPDATE는하지 멀티 스레드, 필요 잠금 없습니다 만 반복하는이 열거를 무효화하면서() 제거를 호출하기 때문에 여전히 키의 목록을 작성해야합니다. 그래서 기본적으로, 당신은 질문에 당신의 의견을 주면 올바르게하고 있습니다.

+0

감사합니다. 저는 레거시 코드를 작성하고 있습니다. 해시 테이블을 사전에 숨겨야한다는 뜻인가요? 그렇다면이 문제를 어떻게 해결할 것인가? 컬렉션을 조작하는 데 더 좋은 API가 있습니까? – RKP

+0

@RKP : 아니요, 일반 컬렉션을 항상 원래 컬렉션으로 선호하는 Microsoft 권장 사항입니다. 보다 성능이 뛰어나고, 복싱이 아닌 등. 그러나 레거시 코드 인 경우 처리 한 내용을 사용해야합니다. –

0

내가 아는 한 멀지 않습니다. 어쨌든 목록을 반복하고 키를 제거하는 것이 잘못된 것입니까? 자주해야 할 일이라면 그냥 함수로 만들어야합니다 ...

.NET Framework 3.5 이상을 사용하는 경우 LINQ를 사용하면 훨씬 쉽게 목표를 달성 할 수 있습니다.

+1

LINQ는 불행히도 시퀀스에 변형 작업을 제공하지 않습니다 (즉, 추가, 제거 등 없음). –

+0

그렇지만 요소가 (a) 조건과 만 일치하는 시퀀스 복사본을 만들 수 있습니다. –

+0

사실, 본질적으로 여전히 제거 할 일련의 결과를 만들고 있습니다. 쿼리 프로세스를 간소화하지만 1) 목록 작성 2) 목록에서 하나씩 모든 키를 제거합니다. 여전히 동일한 알고리즘입니다. 그것이 주요 포인트였습니다. 나는 LINQ 쿼리가리스트를 만들기 쉽다고 동의합니다. –