2010-10-27 222 views
2

我比较两个字典(dic1和dic2)与规则,从dic2获取值,其中键匹配但值不匹配或键在dic2中丢失。
不需要通过DIC2迭代在DIC1缺失/不同的值。比较词典<字符串,列表<object>>

下面的代码工作正常我想知道是否有更好的方式使用.NET 2.0(没有LINQ)。

如果优化是需要哪种选择更好?

Dictionary<string,List<foo>> dic1 = new Dictionary<string,List<foo>>(); 
Dictionary<string,List<foo>> dic2 = new Dictionary<string,List<foo>>(); 

dic1.add("1", new foo("a")); 
dic1.add("2", new foo("b")); 
dic1.add("3", new foo("c")); 
dic1.add("3", new foo("c1")); 
dic1.add("4", new foo("d")); 

dic2.add("1", new foo("a")); 
dic2.add("2", new foo("b1")); 
dic2.add("3", new foo("c")); 
dic2.add("3", new foo("c2")); 

//I write code which allow duplicate key in dictionary 

选项1

foreach (KeyValuePair<string, List<foo>> var in dic1) 
{ 
    if (dic2.ContainsKey(var.Key)) 
    { 
     List<foo> tempList = var.Value.FindAll(delegate(foo s) 
     { 
      return !dic2[var.Key].Contains(s); 
     }); 
     result.AddRange(tempList); 
    } 
    else 
    { 
     result.Add(var.Value); 
    } 

} 

选项2

List<string> list1key = new List<string>(dic1.Keys); 

list1key.ForEach(delegate(string key) 
{ 
    if (dic2.ContainsKey(key)) 
    { 
     List<foo> tempList = dic1[key].FindAll(delegate(foos) 
      { 
       return !dic2[key].Contains(s); 
      }); 
     result.AddRange(tempList); 
    } 
    else 
    { 
     result.AddRange(dic1[key]); 
    } 
}); 

回答

2

可以加快速度与这两种选择,如果你访问DIC2时使用TryGetValue,所以你只需要做一键查找一旦。

你的第一选择看起来更简单,更快的可能,我会与去。 干杯

2

我会用选项1.这是它使用TryGetValue而不是仰视dic2[var.Key]这么多次的变化:

foreach (KeyValuePair<string, List<foo>> var in dic1) 
{ 
    List<foo> dic2val; 
    if (dic2.TryGetValue(var.Key, out dic2val)) 
    { 
     List<foo> tempList = var.Value.FindAll(delegate(foo s) 
     { 
      return !dic2val.Contains(s); 
     }); 
     result.AddRange(tempList); 
    } 
    else 
    { 
     result.Add(var.Value); 
    } 
} 
+0

谢谢修改代码,这将帮助别人 – NETQuestion 2010-10-27 04:52:07

相关问题