我有两本字典,我想比较它们。我想忽略大小写,如果它们有不同的值,则只返回false。这是我的代码。
var dic1 = new Dictionary<String, String>(StringComparer.CurrentCultureIgnoreCase);
dic1.Add("Key 2", "Value 2");
dic1.Add("Key 1", "Value 1");
var dic2 = new Dictionary<String, String>(StringComparer.CurrentCultureIgnoreCase);
dic2.Add("Key 1", "Value 1");
dic2.Add("Key 2", "Value 2");
var areEqual = dic1.OrderBy(r => r.Key).SequenceEqual(dic2.OrderBy(r => r.Key));
Console.WriteLine(areEqual);
正如您所看到的,我正在使用字典类的SequenceEqual方法来比较两个字典。我按键对它们进行了排序,以便在键位置不同时结果不是假的。我似乎无法弄清楚的问题是如何忽略键和值中的情况,并仅在值不同时返回false。在我的情况下,值1和VALUE 1都相等,结果应为true。这不是我的情况。
答案 0 :(得分:2)
您应该检查长度是否相等以及两个词典是否具有相同的键。通过此部分后,您可以使用以下代码段:
var dic1 = new Dictionary<String, String>();
dic1.Add("Key 2", "Value 2");
dic1.Add("Key 1", "Value 1");
var dic2 = new Dictionary<String, String>();
dic2.Add("Key 1", "Value 1");
dic2.Add("Key 2", "Value 2");
bool areEqual = dic1.OrderBy(x => x.Key).Select(x => x.Value.ToUpperInvariant())
.SequenceEqual(dic2.OrderBy(x => x.Key).Select(x => x.Value.ToUpperInvariant()));
Console.WriteLine(areEqual);
答案 1 :(得分:2)
按键排序,选择值并使用SequenceEqual
与StringComparer.OrdinalIgnoreCase
重叠:
bool areEqual = dic1.OrderBy(x => x.Key).Select(kv => kv.Value)
.SequenceEqual(dic2.OrderBy(x => x.Key).Select(kv => kv.Value), StringComparer.OrdinalIgnoreCase);
这些强制执行类似于strcmp
的逐字节比较,这不仅避免了基本上符号字符串的语言解释的错误,而且提供了更好的性能。
答案 2 :(得分:1)
使用自定义比较器结束比较值。这是代码。
class Program
{
static void Main(string[] args)
{
var dic1 = new Dictionary<String, String>();
dic1.Add("Key 2", "Value 2");
dic1.Add("Key 1", "Value 1");
var dic2 = new Dictionary<String, String>();
dic2.Add("Key 1", "Value 1");
dic2.Add("Key 2", "Value 2");
var areEqual = dic1.OrderBy(r => r.Key).SequenceEqual(dic2.OrderBy(r => r.Key), new ProductComparer());
Console.WriteLine(areEqual);
Console.ReadLine();
}
}
internal class ProductComparer : IEqualityComparer<KeyValuePair<string, string>>
{
public bool Equals(KeyValuePair<string, string> x, KeyValuePair<string, string> y)
{
Boolean areEqual = (String.Compare(x.Key, y.Key, StringComparison.OrdinalIgnoreCase) == 0) && (String.Compare(x.Value, y.Value, StringComparison.OrdinalIgnoreCase) == 0);
return areEqual;
}
public int GetHashCode(KeyValuePair<string, string> obj)
{
return obj.GetHashCode();
}
}
答案 3 :(得分:0)
首先,检查长度 - 如果它们不相等则返回false。
接下来迭代每个成员并比较值(假设具有相同的顺序)。您也可以通过迭代第一个字典并检查每个元素是否在第二个字典中来完成此操作。一旦不是,就从循环中断或返回false。