为什么 IEqualityComparer 无法按预期工作?[关闭]

Why IEqualityComparer doesn't work as expected? [closed]

提问人:NoImagination 提问时间:9/28/2022 更新时间:9/28/2022 访问量:59

问:


这个问题是由错别字或无法再现的问题引起的。虽然类似的问题可能在这里是主题,但这个问题的解决方式不太可能帮助未来的读者。

去年关闭。

为什么 EqualityComparer 不起作用? 它应该只留下 2 个元素,其中 相等 - 和 .相反,它由 和 组成,但它们的值不相等。 函数为第 1 个和第 3 个元素返回相同的哈希码!MyEqComparrValuesmyDic["1"]myDic["3"]Value="456"myDic["1"]myDic["2"]GetHashCode

public class Program
    {
        public static Dictionary<string,string> myDic = new Dictionary<string,string>();
        public static void Main()
        {
            myDic.Add("1","456");
            myDic.Add("2","567");
            myDic.Add("3","456");
            var arr=myDic.Distinct(new MyEqComp());
            foreach (var n in arr)
            {
                Console.WriteLine("key="+n.Key+",value="+n.Value+"\n");
            }
        
        }
        class MyEqComp:IEqualityComparer<KeyValuePair<string,string>>{
            public bool Equals(KeyValuePair<string,string> pair1, KeyValuePair<string,string> pair2){
                Console.WriteLine("pair1="+pair1+",pair2="+pair2);
                return pair1.Value == pair2.Value;
            }
            public int GetHashCode(KeyValuePair<string,string> pair){
                var code = pair.Value.GetHashCode();
                Console.WriteLine("code="+code);
                return code;
            }
        }
        
    }

和输出

code=-121858068
key=1,value=456

code=437991364
key=2,value=567

code=-121858068
pair1=[1, 456],pair2=[3, 456]
C# 相等性 IEqualityComparer

评论

6赞 Jon Skeet 9/28/2022
我认为你误读了对要做什么的描述——它旨在给出不同的值,有效地消除任何重复项。听起来你希望它返回重复项。这个输出对我来说看起来不错。Distinct
0赞 NoImagination 9/28/2022
@Jon Skeet,你是对的!我累了,我需要休息:D
0赞 pirela 9/28/2022
您确定 == 适用于您的值(似乎是字符串)吗?
1赞 Tim Schmelter 9/28/2022
我认为你自己的大量日志记录让你感到困惑。最后一个 keyvaluepair 未返回(正确),因为它与第一个 keyvaluepair 具有相同的值。
1赞 Alexei Levenkov 9/28/2022
NoImagination 你可以忽略@pirela评论 - 他们可能认为这是 Java 问题(你不能使用 == 来比较字符串)。

答:

0赞 NoImagination 9/28/2022 #1

答:代码正确且按预期工作。