使用LINQ比较不同字典中具有相同键的项目

时间:2011-08-09 09:52:47

标签: c# .net linq

我有两个带字符串键和不同值类型的词典。

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

我需要比较共享相同键的元素并获得匹配的期望值。这是Expectation类中的方法签名。

public bool Matches(IProperty property)

如何使用LINQ做到这一点?

4 个答案:

答案 0 :(得分:5)

如果我找到你的话,

您可以内部加入集合,然后再获取值

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

有关详细信息,您可以查看此图片: enter image description here

答案 1 :(得分:5)

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 :(得分:4)

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

答案 3 :(得分:1)

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)附加到上述选择方法。