2013-10-24 1 views
1

Key 클래스에 일부 멤버가 있습니다. 키 객체의 멤버가 하나 뿐인 경우 어떻게 사전을 필터링합니까?일부 키의 사전에서 키 값 쌍을 모두 선택하는 방법

class Key 
{ 
    public int a { get; set; } 
    public int b { get; set; } 
} 

public class KeyEqualityComparer : IEqualityComparer<Key> 
{ 
    public int GetHashCode(Key k) 
    { 
     return (k.a + k.b).GetHashCode(); 
    } 

    public bool Equals(Key lhs, Key rhs) 
    { 
     return ((lhs.a == rhs.a) && (lhs.b == rhs.b)); 
    } 
} 

static Dictionary<Key, int> Data = new Dictionary<Key, int>(new KeyEqualityComparer()); 

static void Main(string[] args) 
{ 
    Data.Add(new Key() { a = 0, b = 0 }, 99); 
    Data.Add(new Key() { a = 1, b = 0 }, 99); 

    // select all keys value pairs where the key contains a == 0 
} 
+3

귀하의 경우 중요하지만'(2 + 3) .GetHashCode()'및 ((6 + (-1)). GetHashCode()'와 완전히 다른 쌍은 수치 적 관점이지만 동일한 결과를 준다. – Tigran

+0

U가 정확합니다. 나는 아직 그것에 대해 생각하지 않았다. 지적 해 주셔서 고마워요. – chhenning

+0

다음은 좋은 해시 코드 수식입니다. http://stackoverflow.com/a/892640/781792 –

답변

4
var myPairs = Data.Where(pair => pair.Key.a == 0); 

같은 PROPERT Key의 (들)에 의해 다수의 조회 일을 할 거라면,이보다 효율적으로 만들기 위해 ToLookup를 사용할 수 있습니다 :

var myLookup = Data.ToLookup(pair => pair.Key.a); 
var myPairs = myLookup[0]; 
을 몇 가지 코드입니다
+0

이렇게하면 사전의 목적을 무효로합니다. – Matthew

+0

다른 방법으로 원한다면 사전을 다시 해쉬해야합니다. 'a'로 찾는 것이 일반적인 일이라는 것을 알고 있다면 다른 사전을 만들 수 있습니다. 아마도 사전 >>을 입력 할 수 있습니다. 당신은'Key','a','b'에 의해 룩업을 노출하는 클래스를 만들 수도 있고, 유용하다면 동기화를 추가/제거하는 것을 유지할 수도 있습니다. 그러나 그 질문에 대해 묻는 바로는, 이것이 괜찮다고 생각했습니다. –

+0

'ToLookup'도 있는데, 지금은 내 답변에 추가했습니다. –

1

IEqualityComparer에서 해당 값을 사용하지 않는 사전에서 합성 키의 일부를 검색하면 사전의 요점을 무시합니다. List을 사용할 수도 있습니다.

복합 키의 일부가 제공되지 않을 때 KeyEqualityComparer이 다르게 동작하도록 수정하는 것이 좋습니다.

또는 이와 같이 많은 조회를 수행하고 자주 작성하지 않으려는 경우 다른 평등 비교자를 갖는 여러 사전을 유지 관리 할 수 ​​있습니다.

관련 문제