2011-08-09 8 views
4

文字列キーと値の異なる2つの辞書があります。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; 

(それはキーを2回調べる回避)

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になります。期待値を直接取得するには、上記の選択方法に.Select(kvp => kvp.Value)を追加するだけです。

関連する問題