Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正确实施列表的IEqualityComparer<;字典<;字符串,字符串>&燃气轮机;_C#_.net_Dictionary - Fatal编程技术网

C# 正确实施列表的IEqualityComparer<;字典<;字符串,字符串>&燃气轮机;

C# 正确实施列表的IEqualityComparer<;字典<;字符串,字符串>&燃气轮机;,c#,.net,dictionary,C#,.net,Dictionary,我有两个列表,表示两个表。我想得到那些表中不同的字典对象 我尝试使用Except方法,因为它基本上是做我想做的事情:它返回差异。但由于此方法使用默认比较器,所以我创建了自己的IEqualityComparer实现 在下面的例子中,它工作得很好,但在现实生活中,字典要复杂得多,所以我想知道——我的实现是一个好的解决方案还是必须改进 class Program { static void Main() { var table1 = new List<Dicti

我有两个
列表
,表示两个表。我想得到那些表中不同的字典对象

我尝试使用Except方法,因为它基本上是做我想做的事情:它返回差异。但由于此方法使用默认比较器,所以我创建了自己的IEqualityComparer实现

在下面的例子中,它工作得很好,但在现实生活中,字典要复杂得多,所以我想知道——我的实现是一个好的解决方案还是必须改进

class Program
{
    static void Main()
    {

        var table1 = new List<Dictionary<string, string>>{
        new Dictionary<string,string>{
        {"md5","0x1234"},
        {"file_name","name1234"},
        {"size","1234"}},

        new Dictionary<string,string>{
        {"md5","0x1234"},
        {"file_name","name1234"},
        {"size","1234"}},
        };

        var table2 = new List<Dictionary<string, string>>{
        new Dictionary<string,string>{
        {"md5","0x1234"},
        {"file_name","name1234"},
        {"size","1234"}},

        new Dictionary<string,string>{
        {"md5","0x5678"},
        {"file_name","name5678"},
        {"size","5678"}}
        };

        var diff = table2.Except(table1, new DictionaryComparer());

        foreach (var item in diff)
        {
            foreach (var value in item)
            {
                Console.WriteLine(value);
            }
            Console.WriteLine("+++++++++++++++++++++");
        }

        Console.ReadKey();
    }

    public class DictionaryComparer : IEqualityComparer<Dictionary<string, string>>
    {
        public bool Equals(Dictionary<string, string> first, Dictionary<string, string> second)
        {
            if (first == second) return true;
            if ((first == null) || (second == null)) return false;
            if (first.Count != second.Count) return false;

            foreach (var k in first.Keys)
                if (!second.ContainsKey(k))
                    return false;

            foreach (var k in first.Keys)
                if (!first[k].Equals(second[k]))
                    return false;

            return true;
        }

        public int GetHashCode(Dictionary<string, string> obj)
        {
            int resultValue = 0;

            if (obj == null)
            {
                return 0;
            }        

            foreach (var item in obj)
            {
                resultValue += (item.Key.Length + item.Value.Length);
            }

            return resultValue;
        }

    }
类程序
{
静态void Main()
{
var table1=新列表{
新词典{
{“md5”,“0x1234”},
{“文件名”,“名称1234”},
{“大小”,“1234”},
新词典{
{“md5”,“0x1234”},
{“文件名”,“名称1234”},
{“大小”,“1234”},
};
var table2=新列表{
新词典{
{“md5”,“0x1234”},
{“文件名”,“名称1234”},
{“大小”,“1234”},
新词典{
{“md5”,“0x5678”},
{“文件名”,“名称5678”},
{“大小”,“5678”}
};
var diff=table2.Except(table1,newdictionarycomparer());
foreach(差异中的var项目)
{
foreach(项目中的var值)
{
控制台写入线(值);
}
Console.WriteLine(“+++++++++++++++++++++++++++++++”;
}
Console.ReadKey();
}
公共类词典比较程序:IEqualityComparer
{
公共布尔等于(字典第一,字典第二)
{
if(first==second)返回true;
if((first==null)| |(second==null))返回false;
if(first.Count!=second.Count)返回false;
foreach(first.Keys中的变量k)
如果(!second.ContainsKey(k))
返回false;
foreach(first.Keys中的变量k)
如果(!first[k].等于(second[k]))
返回false;
返回true;
}
公共int GetHashCode(字典obj)
{
int resultValue=0;
if(obj==null)
{
返回0;
}        
foreach(obj中的var项目)
{
结果值+=(item.Key.Length+item.Value.Length);
}
返回结果值;
}
}

我认为更干净的解决方案如下:

public class DictionaryComparer : IEqualityComparer<KeyValuePair<string, string>>
{
    public bool Equals(KeyValuePair<string, string> x, KeyValuePair<string, string> y)
    {
        return x.Key.Equals(y.Key) 
            && x.Value.Equals(y.Value);
    }

    public int GetHashCode(KeyValuePair<string, string> obj)
    {
        return string.Concat(obj.Key, obj.Value)
            .GetHashCode();
    }
}
公共类词典比较程序:IEqualityComparer
{
公共布尔等于(键值对x、键值对y)
{
返回x.Key等于(y.Key)
&&x.值等于(y.值);
}
public int GetHashCode(KeyValuePair obj)
{
返回string.Concat(obj.Key,obj.Value)
.GetHashCode();
}
}

这并不是哈希代码的最佳实现,你应该在谷歌上搜索
GetHashCode实现
并阅读stackoverflow postsWell,听起来你可以去@Callumlington,如果它的字典不存储在hasset或dictionary中,可能就不那么重要了?嗯,如果有对象,似乎会有dif不同的KVP,但这些KVP中的项将具有相同的长度。我将为这些对象获得相同的哈希值,这不是很好,在谷歌搜索了一点之后,我尝试了foreach(obj中的var item){hash+=(17*item.Key.GetHashCode())+item.Value.GetHashCode();}在
GetHashCode()中创建字符串
对于一个应该非常精简且返回速度非常快的函数来说是一个相对昂贵的操作。嗯,那么我们如何比较字典中的值呢?@sstan我认为哈希生成的实现超出了这个Q&a范围,因此代码只是一个简单的例子。您可以访问键值对,因此对象允许您访问bo我更新了答案代码。