如何比较忽略大小写的字典值

本文关键字:大小写 字典 何比较 比较 | 更新日期: 2023-09-27 18:33:04

我有两个词典,我想比较一下。我想忽略大小写,只有在它们具有不同值时才返回 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 和值 1 都是相等的,结果应该是真的。我在这里不是这种情况。

如何比较忽略大小写的字典值

按键排序,选择值并将 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的逐字节比较,这不仅避免了对本质上是符号字符串的语言解释的错误,而且提供了更好的性能。

http://msdn.microsoft.com/en-us/library/ms973919.aspx

您应该真正检查长度是否相等以及两个字典是否具有相同的键。通过此部分后,可以使用以下代码片段:

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);

最终使用自定义比较器来比较值。这是代码。

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();
        }
    }

首先,检查长度 - 如果它们不相等,则返回 false。

接下来遍历每个成员并比较值(假设具有相同的顺序)。您还可以通过循环访问第一个字典并检查每个元素是否在第二个字典中来执行此操作。一旦不是,就中断循环或返回 false。