Tag: iequatable

在可变类型中实现IEquatable

我有一个代表外部物理测量设备的课程。 简化版本如下所示: public class Device { public string Tag { get; set; } public int Address { get; set; } } Tag是用于识别设备的用户定义值。 Address是适配器用于与设备通信的值。 如果两个Device实例具有相同的Address ,则将使用相同的外部测量设备。 我想通过重写Equals并实现IEquatable来模仿代码中的行为(使用Contains和Distinct等方法): public class Device : IEquatable { public string Tag { get; set; } public int Address { get; set; } public override bool Equals(object obj) { return Equals(obj as […]

在IEquatable 实现中是必要的引用检查

我有一个imquments IEquatable 。 是否有必要在Equals()进行参考检查,还是在框架中进行处理? class Foo : IEquatable { int value; Bar system; bool Equals(Foo other) { return this == other || ( value == other.value && system.Equals(other.system) ); } } 在上面的例子中this==other语句是多余的还是必要的? 更新1 我理解我需要更正代码如下: bool Equals(Foo other) { if( other==null ) { return false; } if( object.ReferenceEquals(this, other) ) { return true; } //avoid recursion […]

当对象的标识符为空时,GetHashCode应该返回什么?

考虑到identity属性可以为null,以下哪项是正确/更好的。 public override int GetHashCode() { if (ID == null) { return base.GetHashCode(); } return ID.GetHashCode(); } 要么 public override int GetHashCode() { if (ID != null) { return ID.GetHashCode(); } return 0; } 更新1:更新了第二个选项。 更新2:以下是Equals实现: public bool Equals(IContract other) { if (other == null) return false; if (this.ID.Equals(other.ID)) { return true; } return false; […]

IEquatable接口检查null时要做什么

我已经使用以下代码在类中实现了IEquatable接口。 public bool Equals(ClauseBE other) { if (this._id == other._id) { return true; } return false; } public override bool Equals(Object obj) { if (obj == null) { return base.Equals(obj); } if (!(obj is ClauseBE)) { throw new InvalidCastException(“The ‘obj’ argument is not a ClauseBE object.”); } return Equals(obj as ClauseBE); } public override int […]

我应该使用字符串字段的串联作为哈希码吗?

我在C#中有一个Address类,如下所示: public class Address { public string StreetAddress { get; set; } public string RuralRoute { get; set; } public string City { get; set; } public string Province { get; set; } public string Country { get; set; } public string PostalCode { get; set; } } 我正在实现相等性,所以我需要覆盖哈希码。 起初我打算使用EJ的哈希码公式,但后来我想:这些都是字符串字段,我不能只使用StringBuilder连接它们并从该字符串返回哈希码吗? 那是: var str = new […]

如果我实现IEquatable ,重写Equals是否重要?

我知道在实现自定义相等性检查时重写GetHashCode的重要性 – 我已经实现了IEquality接口,以及此处讨论的generics和非genericsEquals之间的区别。 现在有一个重写Equals(object t)吗? 难道一切都不会归入通用Equals(T t)吗? public override int GetHashCode() //required for hashsets and dictionaries { return Id; } public bool Equals(T other) //IEquatable here { return Id == other.Id; } public override bool Equals(object obj) //required?? { return Equals(obj as T); }

我可以在接口上重载==运算符吗?

我有这样的界面: public interface IFoo { int A {get;} int B {get;} } 我有多个实现IFoo的类。 我想检查相等性,而不是基于ReferenceEquality,但是如果A和B都相同,那么两个IFoos应该被认为是相同的(实际上我正在检查通过WCF发送的Key-Value对的集合,这就是为什么我可以没有ReferenceEquality)。 现在,如果我有: IFoo first = new FooBar1() { A = 1, B = 1}; IFoo second = new FooBar2() { A = 1, B = 1}; if (first == second) { //this should return true } 目前IFoo是IEquatable ,因此FooBar1和FooBar2重写Equals(IFoo other) ,但这不是在==上调用的内容。 我正在搜索我的代码,用a.Equals(b)替换a==b ,但这并不好。 […]