2010-11-03 47 views
0

我问类似的问题在这里,我想知道如何可以实现同样的结果与LINQ比较SortedDictionary <字符串列表<foo>> C#

前面的问题

Compare Dictionary

规则

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

你在问:“能导致和missingkey可以结合在一个?”能?这些查询被合并为一个? – 2010-11-03 05:44:34

回答

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; 

(假定上foo明智Equals实现

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"] 
} 
相关问题