2012-12-30 2 views
5

특정 값을 처리했는지 추적해야하는 경우가 발생합니다. 이 경우 나는 Dictionary(Of TKey, TValue)을 사용하여 내가 처리 한 값을 추적합니다. 기본적으로 각 값이 처리 될 때마다 처리 된 값을 사전에 키로 삽입합니다. 이 값을 처리했는지 확인하려면 ContainsKey 메서드를 사용하여 값이 컬렉션에 있는지 확인합니다.빠른 키 조회를 수행하는 사전 대신 사용할 수 있습니까?

잘 작동하지만 키 - 값 쌍의 값 측면에 무언가를 삽입해야합니다. List(Of T)을 사용 하겠지만 사전에서 제공하는 해시 테이블 조회의 성능을 원합니다. 이 목적에 더 적합한 .Net의 데이터 콜렉션이 있습니까?

+0

'TValue'에 사용할 수있는 보조 키가 있습니까? 그렇지 않다면, 당신이 할 수있는 최선은'List '이고 술어를 사용하는 룩업이다. – casperOne

+0

@casperOne : 아니요, 열쇠가 필요합니다. – poke

+0

이미 하나의 속성을 키잉하고 있지만 그룹의 항목을 구별 할 수있는 두 번째 속성이없는 경우 (여기서 '그룹화'를 실제로 수행하고 있음) 사전이 도움이되지 않습니다. – casperOne

답변

15

나는 HashSet<T>을 제안합니다. 키가 이미 사용되었다는 것만 알면 키를 입력 할 수 있습니다.

너무, 정말 간단합니다

if (myHashSet.Add(key)) 
{ 
    // item wasn't in the hash set, so process it. 
} 

Add은 같다 "거기 경우 추가 할 수 있습니다." 항목이 추가 된 경우 true을 반환합니다. 해당 항목이 이미 컬렉션에 있으면 false을 반환합니다.

또는 Contains을 사용하여 테스트 한 다음 Add을 추가하여 테스트 할 수 있습니다.

+3

이것이 내가이 사이트를 좋아하는 이유입니다. HashSet이이 답변 이전에 존재했다는 것을 깨닫지 못했습니다. (1.0 이후 .NET에서 프로그래밍되었으므로 때로는 새로운 것들이 들러옵니다.) 이제는 여러 가지 문제를 해결할 수있는 더 나은 방법이 있습니다. 감사! –

+0

@competent_tech 그리고 디 컴파일하면 HashSet이 사전의 키 모음과 동일한 구현을 사용하고 있음을 알 수 있습니다. – phoog

0

잠재적으로는 System.Collections.Specialized.StringCollection을 사용할 수 있지만 사전과 같이 성능이 좋을지 모르며 키를 문자열로 전송해야합니다.

항상 Add 메서드에 무언가를 포함해야한다는 요구 사항이 성가신 경우 고유 한 제네릭 키 클래스를 만들 수 있습니다.이 클래스는 기본 .Net 구현이 발견 될 때 적용될 수 있습니다. 예를 들어, VB.Net 가정 :

Public Class KeyDictionary(Of T) 
    Inherits Dictionary(Of T, Boolean) 

    Public Overloads Sub Add(key As T) 
     MyBase.Add(key, False) 
    End Sub 
End Class 

다음 인스턴스를 선언하고 값 추가 :

Dim cKeys As New KeyDictionary(Of Integer) 

    If Not cKeys.ContainsKey(1) Then 
     cKeys.Add(1) 
    End If 

하고, C#으로 :

public class KeyDictionary<T> : Dictionary<T, bool> 
{ 
    public void Add(T key) 
    { 
     base.Add(key, false); 
    } 
} 

인스턴스를 선언하고, 추가 값 :

 var cKeys = new KeyDictionary<int>(); 

     if (!(cKeys.ContainsKey(1))) 
     { 
      cKeys.Add(1); 
     } 
3

.NET 3.5 이상에서는 n 그 목적으로 HashSet을 사용하십시오. 필요한 방법은 AddContains입니다. 두 작업 모두 List에 대한 O (n)와는 반대로 시간 복잡성 O (로그 n)가 있습니다.

+2

사실, '추가'와 '포함'은 O (1)입니다. 설명서를 참조하십시오. –

+0

@ 짐 허? 그것을 찾을 수없는 것 같습니다. –

+0

여기에 발언 : http://msdn.microsoft.com/en-us/library/bb353005.aspx. "Count가 내부 배열의 용량보다 작 으면이 메서드는 O (1) 연산이며, HashSet 개체의 크기를 조정해야하는 경우이 메서드는 O (n) 연산이됩니다. 여기서 n은 Count입니다. –

관련 문제