1

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

4

4 回答 4

2

按键排序,选择值并使用SequenceEqualwith的重载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

于 2013-09-27T07:03:14.407 回答
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);
于 2013-09-27T06:49:39.043 回答
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();
        }
    }
于 2013-09-27T07:00:01.237 回答
0

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

接下来遍历每个成员并比较值(假设具有相同的顺序)。您也可以通过遍历第一个字典并检查每个元素是否在第二个字典中来做到这一点。如果不是,则从循环中中断或返回 false。

于 2013-09-27T06:35:58.470 回答