生成相等比较器
IEqualityComparer<T> 是一个通用的 .NET 接口,允许为集合实现自定义的相等比较。
为您的类型创建一个比较器类是 创建 Equals() 和 GetHashCode() 方法 的替代方案。 生成的比较器类将实现 IEqualityComparer<T> 接口,并提供自定义的 Equals() 和 GetHashCode() 方法。
JetBrains Rider 提供了 生成相等比较器 命令,用于自动生成比较器类。
在下面的示例中,此命令用于基于 _radius 和 _center 字段生成比较器类。
生成前 | 生成后 |
|---|---|
class Circle
{
int _radius;
Point _center;
}
|
class Circle
{
int _radius;
Point _center;
private sealed class RadiusCenterEqualityComparer : IEqualityComparer<Circle>
{
public bool Equals(Circle x, Circle y)
{
if (ReferenceEquals(x, y)) return true;
if (ReferenceEquals(x, null)) return false;
if (ReferenceEquals(y, null)) return false;
if (x.GetType() != y.GetType()) return false;
return x._radius == y._radius && x._center.Equals(y._center);
}
public int GetHashCode(Circle obj)
{
unchecked { return (obj._radius*397) ^ obj._center.GetHashCode(); }
}
}
private static readonly IEqualityComparer<Circle> RadiusCenterComparerInstance
= new RadiusCenterEqualityComparer();
public static IEqualityComparer<Circle> RadiusCenterComparer
{
get { return RadiusCenterComparerInstance; }
}
}
|
生成一个相等比较器类
在编辑器中,将插入点放在类型名称处或类型内您希望插入相等比较器类的行上。 如果插入点位于类型名称上,生成的代码将添加到类型声明的开头。
请按 Alt+Insert 或从主菜单中选择 。 或者,您可以按 Ctrl+Shift+A ,在弹出窗口中开始输入命令名称,然后在那里选择它。
在 生成 弹出窗口中,选择 相等比较器。
在出现的 生成 对话框中,选择要在比较器类中使用的字段。

如果您的类型中没有字段/属性,或者您未选择任何字段/属性,JetBrains Rider 将根据您的设置抛出新的
NotImplementedException(),返回默认值,或在生成的方法体中放置无法编译的代码。可选地,在对话框中使用以下控件:
字段可以为 null — 如果您的类型中有任何可为空的字段或属性,则会显示。 默认情况下,此复选框是选中的,这意味着 JetBrains Rider 将为选定的字段生成空值检查。 如果您不需要空值检查,可以取消选中此复选框。
字符串比较 — 如果您的类型中有任何字符串字段,则会显示。 JetBrains Rider 将为选定的字符串生成
string.Compare(string,string,StringComparison),并且选择器允许您选择应为 StringComparison 参数生成的值。通过静态属性公开 — 使比较器类为私有,并生成一个静态属性,将比较器类暴露给使用者。
比较器名称前缀 — 允许您指定一个前缀,该前缀将用于生成的比较器类的名称。
点击 确定 以完成向导。
或者,您可以编写一个实现 IEqualityComparer<T> 的空比较器类,然后从 Alt+Enter 菜单中选择相应的快速修复:
