比较两个字典是否相等
有些情况下会遇到比较两个字典是否相等的问题
直观来想,会比较键是否一致,其对应的值是否相等
但是同时,作为一个合格的程序猿,我们更应该考虑的是效率问题。
废话不多说,方案如下:
先准备数据
// 先准备两个字典,赋初值。
Dictionary<int, object> dic1 = new Dictionary<int, object>();
Dictionary<int, object> dic2 = new Dictionary<int, object>();
dic1.Add(1, "1");
dic1.Add(2, "1");
dic1.Add(3, "1");
dic1.Add(4, "1");
dic1.Add(5, "1");
dic2.Add(1, "1");
dic2.Add(2, "1");
dic2.Add(3, "1");
dic2.Add(4, "1");
dic2.Add(5, "1");
方法1:字典序列化比较 —— 时间复杂度2n
//
// 方法1:序列化比较 时间复杂度2n
//
bool flagSame = true;
var j1 = JsonConvert.SerializeObject(dic1);
var j2 = JsonConvert.SerializeObject(dic2);
if (!j1.Equals(j2))
{
flagSame = false;
}
Console.WriteLine(flagSame ? "相等" : "不相等");
方法2:字典比较 —— 时间复杂度 min:O(1) max:O(n²)
/// <summary>
/// 判断两个字典是否完全相等
/// </summary>
/// <param name="d1"></param>
/// <param name="d2"></param>
/// <returns></returns>
public static bool DictionaryEquals(Dictionary<string, string> d1, Dictionary<string, string> d2)
{
bool equal = true;
if (d1.Count != d2.Count)
{ // Require equal count.
return false;
}
foreach (var pair in d1)
{
string value;
if (d2.TryGetValue(pair.Key, out value))
{
if (value != pair.Value)
{
equal = false;
break;
}
}
else
{
equal = false;
break;
}
}
Console.WriteLine(equal ? "相等" : "不相等");
return equal;
}
方法3:Linq写法(最简) —— 时间复杂度 时间与其二相差不大 推荐
/// <summary>
/// 判断两个字典是否完全相等
/// </summary>
/// <param name="d1"></param>
/// <param name="d2"></param>
/// <returns></returns>
public static bool DictionaryEquals(Dictionary<string, string> d1, Dictionary<string, string> d2)
{
return !d1.Any(t1 => d2.FirstOrDefault(t2 => t2.Key == t1.Key).Value != t1.Value);
}