2011-08-09 3 views
4

두 개의 사전에는 문자열 키와 다른 값 유형이 있습니다.LINQ를 사용하여 다른 사전의 항목을 동일한 키로 비교하십시오.

private Dictionary<string, IProperty> _properties; 
private Dictionary<string, Expectation> _expectations; 

동일한 키를 공유하는 요소를 비교하고 예상 기대치를 얻어야합니다. Expectation 클래스에서 내 메소드 서명은 다음과 같습니다.

public bool Matches(IProperty property) 

LINQ를 사용하여 어떻게 할 수 있습니까? 내가 정확하게 당신을 얻을 경우

답변

4
var result = _expectations.Where(e => _properties.Any(p => p.Key == e.Key && e.Value.Matches(p.Value))); 
+0

직선적 인 검색을 할 때 직관적으로 직감적 인 반응을 보일 때'_properties'에서 올바른 키를 찾습니다. 사전입니다. 간단한 대안을 보려면 [내 대답] (http://stackoverflow.com/a/35543859/533837)을 참조하십시오. – AnorZaken

5

,

당신은 내부 컬렉션의 모두 가입 할 수 있습니다와 가치를보다 다시

var exp = form p in _properties 
      join e in _expectations 
      on p.key equals e.key 
      select e; 

세부 사항에 대한 youcan이 이미지 확인 : enter image description here

+1

Linq에 'inner join' 명령어가 없습니다. –

+0

@Thomas Levesque - 네, 그것의 업데이트되었습니다. –

4
var result = from pKey in _properties.Keys 
      where _expectations.ContainsKey(pKey) 
      let e = _expectations[pKey] 
      select e; 

_expectations의 키 조회를 활용하므로 조인보다 효율적입니다. 그것은 약간 같은 확장 방법을 사용하여 개선 될 수있다 : 당신은 키가 모두 사전에 있는지 알고 있다면

public static TValue GetValueOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key) 
    where TValue : class 
{ 
    TValue value; 
    if (dictionary.TryGetValue(key, out value)) 
     return value; 
    return null; 
} 

var result = from pKey in _properties.Keys 
      let e = _expectations.GetValueOrDefault(pKey) 
      where e != null 
      select e; 

(이 키를 두 번 보는 것을 피한다)

0
var matches = _expectations.Where(
    kvp => _properties.ContainsKey(kvp.Key) && kvp.Value.Matches(_properties[kvp.Key])); 

당신 뿐만 아니라 ContainsKey 체크를 제거 할 수 있습니다

var matches = _expectations.Where(kvp => kvp.Value.Matches(_properties[kvp.Key])); 

위 결과는 KeyValuePairs입니다. Expectations에서 직접 얻으려면 .Select(kvp => kvp.Value)을 위의 선택 방법에 추가하십시오.

관련 문제