比较SortedDictionary <string,list <foo =“”>&gt; C#</串,>

时间:2010-11-03 05:33:36

标签: c# linq

我在这里问了类似的问题,我想知道如何用LINQ

获得相同的结果

以前的问题

Compare Dictionary

规则

从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;
 } 

2 个答案:

答案 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