2011-04-13 2 views
0

Okai, 나는 다음과 같은 방법을 가지고 :SortedDictionary 중복 키?

public void Insert(SortedDictionary<byte[], uint> recs) 
{ 
    SortedDictionary<byte[], uint> records = new SortedDictionary(recs, myComparer); 
} 

내가 달성하기를 바라고있는 "recs"IComparer 구현하는 "myComparer"에 의해 지정된 새 규칙을 사용하여 레코드를 정렬하는 것입니다. 꽤 많이 그렇긴하지만 다음과 같은 메시지로 예외가 발생합니다.

이미 동일한 키가 인 항목이 있습니다.

"recs"는 이미 약 130k 개의 키가있는 사전이므로이 방법이 가능한지 궁금합니다.


 public int Compare(byte[] a, byte[] b) 
    { 
     return Inhouse.ByteConverter.ToString(a).CompareTo( 
        Inhouse.ByteConverter.ToString(b)); 
    } 

(그냥 snipette ..)

+0

'SortedDictionary 대신 반환 형식이'SortedDictionary '입니까? –

+0

당신은 Comparer의 코드를 게시해야합니다. 그렇지 않으면 우리는 당신을 그렇게 도울 수 없습니다. – digEmAll

+0

Comparer 코드 샘플을 –

답변

1

"RECS는"당신은 당신이 중복을 얻을 수 기록에 주입 아닌 다른 비교자를 경우; 즉, "recs"가 객체 참조에 의해 비교되고 myComparer가 실제 바이트를 비교하면 충돌이 발생합니다.

0

확인 비교 자 코드 :

SortedDictionary ( TKEY의, TValue)의 모든 키는 지정된 비교에 따라 고유해야합니다; 따라서 원본 사전의 모든 키는 지정된 비교 자에 따라 고유 한 이어야합니다. 정상 byte[] comparaison와 새로운 비교 자와

, 2 개의 다른 키를 동일하게 할 수있다.

그것은 MSDN says...

+0

재미있는 사실이지만, 아직도 그 이유는 알지 못합니다. Comparer가 어떻게 든 키를 변경합니까? –

+0

아니요, 새 사전은 비교 자로 키를 정렬하지만 해당 비교 자와 동일한 두 키를 찾으면 불만을 제기합니다. 사전에 동일한 키를 두 번 이상 추가하려고 할 때와 동일한 상황입니다 (이 경우 동일한 키는 기본 비교 자로 정의되고 경우에 따라 사용자 지정 비교 자로 정의됩니다). – manji

+0

'a! = b'가있는'a'와'b' 키와'Inhouse.ByteConverter.ToString (a) .CompareTo (Inhouse.ByteConverter.ToString (b)) == 0' – manji

0

당신은 호출하는 방법 같은 Dictionary 객체를 사용해야거야.

SortedDictionary<byte[], uint> dic = new SortedDictionary<byte[], uint>(); 
foreach (var thing in things) 
{ 
    dic.Clear(); 
    Populate(dic); 
    Insert(dic); 
} 

은 다음과 같이해야한다 :

SortedDictionary<byte[], uint> dic = new SortedDictionary<byte[], uint>(); 
foreach (var thing in things) 
{ 
    dic = new SortedDictionary<byte[], uint>(); 
    Populate(dic); 
    Insert(dic); 
} 

당신은 당신의 Insert 방법을 호출하는 코드를 게시 할 수 그래서 난 당신의 코드는 다음과 같은 상상?

+0

나는 호출 범위에 접근 할 수 없다. –