2012-03-30 3 views
3

List()를 Dictionary() 키로 사용하여 약간의 문제가 발생했습니다. 사전 목록의 내용보다는 목록의 참조를 사용하고 있기 때문에List of Key of List <T>

Dictionary<List<double>, string> test = new Dictionary<List<double>, string>(); 
var a = new List<double>() { 1.0 }; 
var b = new List<double>() { 2.0 }; 

test.Add(a, "A"); 
test.Add(b, "B"); 

// Works because the reference is the same 
Console.WriteLine(test[a]); 

// KeyNotFoundException 
Console.WriteLine(test[new List<double>() { 1.0 }]); 

내가 오류를 알고 여기에 문제를 보여줍니다 내 샘플 코드입니다. 이상적으로 TKey가 목록 인 경우 키가 존재하는지 여부를 결정하기 위해 SequenceEquals를 사용해야합니다.

이 문제를 해결하는 방법에 대한 아이디어가 있습니까? 사용할 수있는 다른 컬렉션이 있습니까? SequenceDictionary라는 새로운 래퍼 클래스를 생성해야합니까?

+0

그렇다면 먼저 인스턴스를 만들지 않고서는 어떻게 할 수 없습니까? – evasilchenko

+0

'List'를 사용하여 Ex IList를 구현하고 (Equals와 GetHashCode를 오버라이드하는) 자신의 클래스를 작성하십시오. –

+0

@DeviantSeev : var c = new List () {1.0};'then'test [c]'c = {1.0}'인데도 'c'가 다른 참조를 가지고 있기 때문에 예외가 여전히 발생합니다. – Mark

답변

4

사전에 대한 사용자 지정 비교자를 지정해야합니다. 사전 생성자는 추가 IEqualityComparer<List<double>> 매개 변수를 사용하여 오버로드를 수행합니다. 그런 다음 두 개의 List<double>을 비교할 수있는 Compare 메서드를 사용하여 클래스를 만들어야합니다.

다른 옵션은 목록 이외의 키를 찾는 것입니다. 목록은 여러 가지 이유로 훌륭한 키를 만들지 않습니다.

  • 두 목록을 빨리 비교할 수 없습니다. 비교 방법은 O (n)입니다.
  • 목록의 해시를 빨리 계산할 수 없습니다. 목록의 항목을 모두 으로 사용하여 적절한 해시를 작성해야합니다.
  • 사전에있는 동안 목록이 변경되면 해시 코드 이 변경되어 모든 종류의 내용이 손상됩니다. 목록에 이 있어야 사전에서 키가 될 수 있습니다.
+0

당신은 IEqualityComparer가 아니라 Comparer 뜻. 하지만 그 외, 예 : –

+0

@ 존 키켓 그래, 편집 중이 었어. – Servy

2

List<double>에서 파생되고 독자적인 키 클래스를 만들고 IComparable을 구현합니다.

관련 문제