2011-08-09 35 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; 

查看詳細遵守前面檢查這一形象: 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。要直接獲得期望值,只需將.Select(kvp => kvp.Value)附加到上述選擇的方法。