Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.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# 对于.NET字典,我应该使用什么比较器来使用EqualityComparer<;T>;关键的方法?_C#_.net_Dictionary - Fatal编程技术网

C# 对于.NET字典,我应该使用什么比较器来使用EqualityComparer<;T>;关键的方法?

C# 对于.NET字典,我应该使用什么比较器来使用EqualityComparer<;T>;关键的方法?,c#,.net,dictionary,C#,.net,Dictionary,我的Position类是从EqualityComparer类派生的。我希望字典使用重写的方法,但它正在使用Object.Equals和Object.GetHashCode中的方法。对于字典我应该使用什么比较器来使用Position类的EqualityComparer方法 using System.Collections.Generic; using System.Diagnostics; namespace ConsoleApp1 { class Position : Equality

我的
Position
类是从
EqualityComparer
类派生的。我希望字典使用重写的方法,但它正在使用
Object.Equals
Object.GetHashCode
中的方法。对于
字典
我应该使用什么比较器来使用
Position
类的
EqualityComparer
方法

using System.Collections.Generic;
using System.Diagnostics;

namespace ConsoleApp1
{
    class Position : EqualityComparer<Position>
    {
        public int X { get; set; }
        public int Y { get; set; }

        public override bool Equals(Position left, Position right)
        {
            if (left == null || right == null)
                return false;

            return left.X == right.X && left.Y == right.Y;
        }

        public override int GetHashCode(Position cell)
        {
            if (cell == null)
                return 0;

            return cell.X * 31 + cell.Y;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var dictionary = new Dictionary<Position, int>();
            var position = new Position();
            position.X = 1;
            position.Y = 1;
            dictionary[position] = 1;
            position = new Position();
            position.X = 1;
            position.Y = 1;
            var found = dictionary.TryGetValue(position, out var result);
            Debug.Assert(found);
            Debug.Assert(result == 1);
        }
    }
}
使用System.Collections.Generic;
使用系统诊断;
名称空间控制台EAPP1
{
班级职务:平等比较
{
公共整数X{get;set;}
公共整数Y{get;set;}
公共覆盖布尔等于(位置左,位置右)
{
如果(左==null | |右==null)
返回false;
返回left.X==right.X&&left.Y==right.Y;
}
公共覆盖int GetHashCode(位置单元格)
{
if(单元格==null)
返回0;
返回单元格.X*31+单元格.Y;
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var dictionary=newdictionary();
变量位置=新位置();
位置X=1;
位置Y=1;
字典[位置]=1;
位置=新位置();
位置X=1;
位置Y=1;
找到的var=dictionary.TryGetValue(位置,输出var结果);
断言(找到);
Assert(result==1);
}
}
}
虽然在对象本身上实现比较器非常不寻常,但只需将比较器实例传递给
字典
构造函数,如示例所示

var dictionary=newdictionary(newposition());
更常见的方法是

  • 为比较器使用单独的类(如果您需要多个比较变体)-使用类型本身的
    Equals
    GetHashCode
    实现
    IEquatable
    (如果存在与您的情况类似的自然等式)。在值类型为
    Equals(object)
    的情况下,这优于
    object.Equals方法
  • 只需实现John中所示的
    object.Equals
    object.GetHashCode
    ——这是最直接的方法,用于判断您的类型是否具有自然相等性,并且它是引用类型(
    class

备选答案:您可以覆盖
位置
获取hashcode
等于
方法:

class Position
{
    public int X { get; set; }
    public int Y { get; set; }

    public override bool Equals(object other)
    {
        if (other == null || !(other is Position))
        {
            return false;
        }
        var otherPosition = (Position)other;
        return otherPosition.X == this.X && otherPosition.Y == this.Y;
    }

    public override int GetHashCode()
    {
        return this.X * 31 + this.Y;
    }
}
这样,您可以简单地声明您的字典,如下所示:

var dict = new Dictionary<Position, string>();
var dict=newdictionary();
它会像你期望的那样工作


“我的职位”类是从EqualityComparer类派生而来的。-您希望在那里发生什么?比较器是用来比较其他一些对象的…很可能你把它和
equalable
混在一起了…可能这澄清了一些…@AlexeiLevenkov我希望字典调用Position.GetHashCode(Position单元格)来获取Position类的哈希代码,并调用Position.Equals(Position left,Position right)要确定Position类是否与dictionary或notEquality中的相同,请通过Object.Equals(非静态类)进行检查。如果你想改变这些规则,重写这个函数|比较器就是要找到两个事物的相对位置。它们通过返回int来实现这一点。有两个比较器:默认比较器和显式比较器
ICombarable
是默认比较器的比较器。然而,它的函数变得很难定义,一旦你得到了超过1个字段——X的值比Y高吗?|显式比较器类似于
IComparer
。然而,在LINQ或委托中,lambda表达式也是一种东西。明白了。我同意,这个逻辑应该是单独的类。@RM我已经更新了答案,所以它很可能解决了您在注释中的所有问题(包括奇怪的“避免装箱”注释)。请注意,这正是OP想要避免的-
Equals(object)
需要对
结构进行装箱。。。但是OP有
类位置
——因此没有任何装箱。
var dict = new Dictionary<Position, string>();