【发布时间】:2019-11-14 01:22:43
【问题描述】:
我的Position 类派生自EqualityComparer<T> 类。我希望字典使用覆盖的方法,但它使用的是Object.Equals 和Object.GetHashCode 中的方法。我应该为Dictionary 使用什么比较器来使用Position 类的EqualityComparer<T> 方法?
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);
}
}
}
【问题讨论】:
-
"我的 Position 类派生自 EquailityComparer 类。" - 你到底希望那里发生什么?比较器是比较其他一些对象…可能你把它和
Equatable<T>混合了…可能这个stackoverflow.com/questions/25853384/…澄清了一些… -
@AlexeiLevenkov 我希望 Dictionary 调用 Position.GetHashCode(Position cell) 来获取 Position 类的哈希码并调用 Position.Equals(Position left, Position right) 来确定 Position 类是否为是否与字典中的相同
-
它的相等性由 Object.Equals (非静态的)检查。如果要更改这些规则,请覆盖该函数 |比较器是关于找到两个事物的相对位置。他们通过返回一个 int 来做到这一点。有两个比较器:默认比较器和显式比较器。 |
ICombarable<T>是默认比较器。然而,它的功能变得很难定义,一旦你得到超过 1 个字段 - X 的值是否高于 Y? |显式比较器类似于IComparer<T>。但是在 LINQ 或委托中,lambda 表达式也是一回事。
标签: c# .net dictionary