2011-11-16 1 views
0

T에서 속성 값으로 검색 가능한 컬렉션을 갖고 싶습니다.이 속성은 수명 동안 여러 번 변경 될 가능성이 있습니다 검색의 속도는 중요합니다. 선형 검색은 중요하지 않습니다..NET에서 개체의 속성을 지정하여 개체 모음을 가장 빨리 검색하십시오.

사전의 별도 인스턴스를 성공적으로 사용했지만 다른 컬렉션을 유지하는 것이 마치 뾰족한 것처럼 보입니다. 더 좋은 방법이 있기를 바랍니다.

하나의 가능성은 속성별로 정렬 된 내 개체를 정렬 된 상태로 유지할 수있는 SortedSet 클래스를 사용하는 것입니다. SortSet을 Array에 복사하고 Array.BinarySearch를 사용할 수는 있지만 검색 할 때마다이 배열을 만드는 오버 헤드를받을 수 없습니다. SortedSet에서 BinarySearch를 사용할 수있는 방법이 있습니까?

필자는이 질문을 적어도 두 번 이상 보았지만 필자는 내 사전 접근 방식에 대한 분명한 대안을 생각할 수 없었습니다.

.Net 4.0을 사용하고 있습니다.

+0

동등 검색입니까? 또는 범위 검색? 크기는 얼마입니까? (얼마나 많은 레코드가 있습니까?) 인덱스 된 고유 한 값입니까? –

+0

평등 검색, 500-5000 품목. 색인 값은 고유합니다. 이 속성은 메시지의 일부로 다른 시스템에 전송되는 자동 생성 식별자입니다. 검색은 "다른"시스템이 응답으로 응답 할 때 발생합니다. 그런 다음 T의 내 인스턴스에 응답을 적용해야합니다. – sevzas

답변

0

이 것이 좋겠습니까? 물론 기본 집합을 목록이 아닌 다른 것으로 변경할 수 있으며 작성한대로 작동한다는 것을 보장하지는 않지만 목록을 계속 업데이트하는 것이 좋습니다.

public class Holder 
{ 
    public Action OnPropChange; 

    int _prop; 
    public int Prop 
    { 
     get 
     { 
      return _prop; 
     } 
     set 
     { 
      _prop = value; 
      OnPropChange(); 
     } 
    } 
} 

public class SortedListThing : List<Holder> 
{ 
    public void Add(Holder h) 
    { 
     BinarySortedInsert(h); 
     h.OnPropChange =() => { this.Remove(h); base.Add(h); }; 
    } 

    private void BinarySortedInsert(Holder h) 
    { 
     //do stuff 
    } 

    public void Remove(Holder h) 
    { 
     h.OnPropChange = null; 
     base.Remove(h); 
    } 
} 
+0

이 방법이 작동하며 더 좋은 소리가 들리지 않으면이를 구현합니다. – sevzas

관련 문제