2014-06-24 2 views
0

사전을 사용하여 엔티티를 저장하는 상황입니다. 각 엔티티에는 값을 검색 할 때 색인화 할 ID가 두 개 있습니다. 하나는 객체가 생성 될 때 (이 ID라고 부름) 다른 하나는 외부 소스 (이 핸들을 호출 함)에서 읽혀질 때 생성됩니다. 나는 ToLookup()으로 놀았으며 매우 느리다. 두 식별자를 모두 포함하는 사용자 지정 키 개체를 만들었지 만 사전의 기본 사용은 연결된 값을 검색하기 위해 두 가지를 모두 알아야한다는 것을 의미합니다. 하나 또는 다른 것을 알고있는 경우 매우 빠른 솔루션이 필요합니다. 어떤 도움을 주시면 감사하겠습니다. 또한 내부적으로 두 개의 사전을 포함하는 클래스를 만들려고했으나 포인터 참조가 메모리 영역에 추가되는 것 같아 올바른 접근 방식인지는 확실하지 않습니다. 내가 메모리 풋 프린트에 대해 다소 걱정하는 이유 중 하나는 타사 시스템에로드 할 수 있도록 dll로 컴파일하기 때문입니다. 나는 사용할 메모리의 양을 제어하지 못하기 때문에 더 많이 사용할수록 내가 할 수있는 일은 줄어든다. 이것이 명확하지 않은 경우 나는 약간의 단순화 된 예제를 제공 할 수 있습니다. 제공 할 부분을 알려주세요.각 키만 사용하여 여러 키를 사용하여 사전에서 값 검색

답변

0

글쎄, 내가 생각하기에 최선의 타협안을 생각해 냈다. 내가 조회로 사용되는 내부 하위 사전과 기본 사전을 사용하여 끝났다. 하위 사전은 ID를 저장하고 Handle에 의해 색인화됩니다. 그런 다음 핸들에 대한 사용자 정의 인덱서를 만들고 ID 사전을 사용하여 ID를 찾은 다음 기본 인덱서를 호출하여 실제 값을 검색 할 수 있습니다. 이렇게하면 사전을 복제하는 것보다 약간 더 가벼워집니다. 그것은 다른 이상 하나를 선택의 문제가되지 않을 때까지

public class MultiKeyDictionary : Dictionary<EntityID, string> 
{ 
    private Dictionary<string, EntityID> _handleLookup = new Dictionary<string, EntityID>(); 
    public Dictionary<string, EntityID> HandleLookup 
    { 
     get { return _handleLookup; } 
     set { _handleLookup = value; } 
    } 

    public string this[string handle] 
    { 
     get 
     { 
      EntityID id = this.HandleLookup[handle]; 
      return base[id]; 
     } 
    } 

    public void Add(EntityID id, string handle, string value) 
    { 
     base.Add(id, value); 
     this.HandleLookup.Add(handle, id); 
    } 
} 
0

두 가지 가능한 키 유형 중 하나만 주어진 값을 효율적으로 검색 할 수있는 유일한 방법은 두 개의 사전이 있어야하며 본질적으로 두 배의 메모리 (약)가 필요합니다. 단일 조회로 그 주위에는 실제적인 방법이 없습니다.

많은 메모리를 사용할 수없는 경우 선형 검색과 같이 훨씬 덜 효율적인 검색 알고리즘을 사용해야합니다.

당신의 선택, 실행 속도 또는 메모리입니다. 하나 골라야 해.

+0

내가 기대했다 : 다른 사람이 관심 (또는 개선하거나 나에게 더 나은 방향을 표시하거나 다른 의견을 가지는 경우), 여기에 아주 간단한 예입니다 대신 누군가가 슬리브를 돌리면서 실행 속도와 메모리의 균형을 맞출 수 있기를 바랬습니다. – bjhuffine

관련 문제