2010-11-03 50 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"] 
} 
相關問題