比较SortedDictionary <字符串列表> C#
问题描述:
我问类似的问题在这里,我想知道如何可以实现同样的结果与LINQ比较SortedDictionary <字符串列表<foo>> C#
前面的问题
规则
从dic2获取值,其中密钥匹配但值不匹配或密钥在dic2中丢失。 不需要通过dic2迭代dic1中的丢失/不同值。
LINQ CODE
可能导致与missinkeu可以在一个COMBIN 强大的文本è?
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;
}
答
你刚才的意思是:
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;
(假定上foo
明智Equals
实现
答
将它写成循环代替它会更好。这是我将如何实现它:
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"]
}
你在问:“能导致和missingkey可以结合在一个?”能?这些查询被合并为一个? – 2010-11-03 05:44:34