我将两个字典(dic1和dic2)与从dic2获取值的规则进行比较,其中键匹配但值不匹配或者dic2中缺少键。
不需要在dic1中迭代dic2来查找缺失/不同的值。
下面的代码工作正常我想知道是否有更好的方法使用.NET 2.0(NO 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]);
}
});
答案 0 :(得分:2)
如果在访问dic2时使用TryGetValue,您可以使用任一选项加快速度,因此您只需要进行一次键查找。
你的第一个选项看起来更简单,也可能更快,我会选择它。 干杯
答案 1 :(得分: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);
}
}