我在这里问了类似的问题,我想知道如何用LINQ
获得相同的结果以前的问题
规则
从dic2获取值,其中键匹配但值不匹配或者dic2中缺少键。 不需要在dic1中迭代dic2来查找缺失/不同的值。
LINQ CODE
可以结果和missinkeu可以将强文组合在一起吗?
private void Compare(SortedDictionary<string, List<foo>> dic1, SortedDictionary<string, List<foo>> dic2)
{
var result= from c in dic1
where dic2.ContainsKey((c.Key) && !dic2[c.key]Equals(c.Value)
select p.Value;
var missingkey =from c in dic1
where !dic2.ContainsKey((c.Key)
select p.Value;
}
答案 0 :(得分:0)
最好将此作为循环编写。以下是我将如何实现它:
static void Compare(SortedDictionary<string, List<foo>> dic1, SortedDictionary<string, List<foo>> dic2)
{
var result = new List<List<foo>>();
var missingkey = new List<List<foo>>();
foreach (var kvp in dic1)
{
var value = default(List<foo>);
if (dic2.TryGetValue(kvp.Key, out value))
{
if (kvp.Value.SequenceEqual(value))
result.Add(value);
}
else
{
missingkey.Add(kvp.Value);
}
}
}
如果你坚持使用LINQ来做到这一点,这是一种方法:
static void Compare(SortedDictionary<string, List<foo>> dic1, SortedDictionary<string, List<foo>> dic2)
{
const string isIgnored = null, isResult = "result", isMissingkey = "missingkey";
var combined = (from kvp in dic1
group kvp.Value by (dic2.ContainsKey(kvp.Key)
? kvp.Value.SequenceEqual(dic2[kvp.Key])
? isResult
: isIgnored
: isMissingkey) into g
where g.Key != isIgnored
select g)
.ToDictionary(g => g.Key, g => g.ToList());
// result in combined["result"]
// missingkey in combined["missingkey"]
}
答案 1 :(得分:0)
你的意思是:
var result = from pair in dic1
where !dic2.ContainsKey(pair.Key)
|| !dic2[pair.Key].Equals(pair.Value)
select pair.Value;
当密钥存在时,测试第二个匹配。但请注意,这将仅(如所写)在列表上进行参考测试 - 它不会比较单个元素。很难说这是不是你的意思,因为链接帖子中的代码示例是......“不清楚”(因为它试图将foo
添加为List<foo>
的值)。
如果您需要测试各个值:
var result = from pair in dic1
where !dic2.ContainsKey(pair.Key)
|| !dic2[pair.Key].SequenceEqual(pair.Value)
select pair.Value;
(假设在Equals
上实施合理的foo
。