- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个代表外部物理测量设备的类。简化版本如下所示:
public class Device {
public string Tag { get; set; }
public int Address { get; set; }
}
Tag
是用于识别设备的用户定义值。 Address
是适配器用来与设备通信的值。如果 Device
的两个实例有相同的Address
, 然后将使用相同的外部测量设备。
我想通过覆盖 Contains
来模仿代码中的这种行为(使用 Distinct
和 Equals
等方法)并实现 IEquatable<T>
:
public class Device : IEquatable<Device> {
public string Tag { get; set; }
public int Address { get; set; }
public override bool Equals(object obj) {
return Equals(obj as Device);
}
public bool Equals(Device other) {
if (null == other) return false;
if (ReferenceEquals(this, other)) return true;
return Address.Equals(other.Address);
}
}
如您所见,我忽略了 Tag
属性(property)在执行Equals
.
所以,我的问题是: 我应该忽略 Tag
吗?属性(property)在执行Equals
?这样做会使代码更难理解吗?有没有更好的方法来做我想做的事情?我需要 Tag
属性,因为用户通常不知道 Address
,甚至是否 Device
有一个 Address
(这是在 App.config 文件中处理的,用户将处理一个名为 IDevice
的接口(interface),它没有 Address
属性)。
更新:
感谢大家的回复。
所以,我想我应该使用自定义 IEqualityComparer
.如果我的真实代码看起来更像这样,您是否有关于如何执行此操作的任何指导?
public interface IDevice {
string Tag { get; set; }
double TakeMeasurement();
}
internal class Device : IDevice {
public string Tag { get; set; }
public int Address { get; set; }
public double TakeMeasurement() {
// Take a measurement at the device's address...
}
}
我应该检查我的 IEqualityComparer
中的设备类型吗? ?
public class DeviceEqualityComparer : IEqualityComparer<IDevice> {
public bool Equals(IDevice x, IDevice y) {
Contract.Requires(x != null);
Contract.Requires(y != null);
if ((x is Device) && (y is Device)) {
return x.Address.Equals(y.Address);
}
else {
return x.Equals(y);
}
}
public int GetHashCode(IDevice obj) {
Contract.Requires(obj != null);
if (obj is Device) {
return obj.Address.GetHashCode();
}
else {
return obj.GetHashCode();
}
}
}
最佳答案
首先你忘了重写GetHashCode()
,所以您的代码已损坏。
IMO 你应该覆盖 Equals
仅当两个对象对于所有目的都是等价的。和不同的对象Tag
出于某些目的,它们似乎有所不同。
我不会覆盖 Equals
在所有这些对象上。我宁愿实现一个自定义比较器 IEqualityComparer<T>
并在适当的地方使用它。大多数具有相等概念的方法都采用 IEqualityComparer<T>
。作为可选参数。
我不会禁止 null
参数,但要处理它们。我还为引用平等添加了早出。
public class DeviceByAddressEqualityComparer : IEqualityComparer<IDevice> {
public bool Equals(IDevice x, IDevice y) {
if(x==y)
return true;
if(x==null||y==null)
return false;
return x.Address.Equals(y.Address);
}
public int GetHashCode(IDevice obj) {
if(obj == null)
return 0;
else
return obj.Address.GetHashCode();
}
}
如果要检查类型,取决于上下文。当覆盖 Equals
我通常检查是否 x.GetType()==y.GetType()
,但由于您在这里使用了一个特殊用途的比较器,它故意忽略了对象的一部分,所以我可能不会将类型作为标识的一部分。
关于c# - 以可变类型实现 IEquatable<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9265269/
我有一个树型类 Foo及其界面 IFoo . 我想要 Foo能够实现IEquatable>什么时候T : IEquatable (或者更一般地说,如果 T : I 我可能想要 Foo : I> 除了其
域类 T可以是 ValueObject 类型: public class Coordinate: ValueObject { ... } ValueObject实现 IEquatable界面。我想要
我首先使用带有 EntityFramework 代码的 ASP.NET MVC。 我正在尝试为将保存到我的数据库中的所有对象创建一个基类(这里称为实体类)。 有没有在基类中实现IEquatable的好
我想比较两个相同类型的自定义类对象。被比较的自定义类有一个 List 属性,其中填充了另一种自定义类型的项目。这可以通过继承 IEquatable 实现吗? 我不知道如何通过修改 MSDN's cod
当我使用 IEquatable interface 实现要比较的对象时: 为什么我必须覆盖 Equals(object)方法,如果我已经实现 Equals(T) ? 我可以使用==吗?和 !=运营商一
我想要一个通用类来实现 IEquatable 接口(interface)。该类具有 T 类型的数据项。要使泛型类等同,数据项也必须是 T 类型。 这是我的通用类: public class V : I
我有一个代表外部物理测量设备的类。简化版本如下所示: public class Device { public string Tag { get; set; } public int
我有一个 IEquatable方法如下: public bool Equals(TravelOptions other) { if (other == null) return false;
我有一个来自 SQL Server 数据库的 POCO,它有一个身份 ID 字段。我想实现 IEquatable 这样我就可以检查它们是否是相同的记录,使用 .Contains()在 List等 假设
我尝试使用以下方法来阻止人们更改 querystring为了查看其他人的详细信息: public static bool IsCurrentUserAuthorisedVessel(HttpReque
假设我有以下类(class): public sealed class ScaleValue : IComparable, IComparable, IEquatable { publ
我有一个可以毫无问题地序列化为 XML 的对象。但是,当我实现 IEquatable 并覆盖函数时,我收到有关未正确生成 XML 的错误。以前有人遇到过这个吗? 最佳答案 您可能需要覆盖 Equals
这是一个关于我正在尝试做的事情的例子: public class Foo : IEquatable { public bool Equals(Foo other) {
我经常使用代表工厂生产的实体的类。为了方便地测试我的工厂,我通常实现 IEquatable , 同时也覆盖 GetHashCode和 Equals (如 MSDN 所建议)。 例如;采用以下为示例目的
我有一个包含两个字符串和一个枚举的类。我正在尝试使用此类的实例作为字典中的键。不幸的是,我似乎没有正确实现 IEquatable。这是我的做法: public enum CoinSide {
我想知道 F# 中的相等测试在哪些情况下会导致装箱,以及是否存在覆盖 Equals 的情况。和 GetHashCode并实现IEquatable<>比使用 StructuralEqualityAttr
我刚刚将 Visual Studio 更新到最新的 16.6.0 Preview 1.0 和最新的 .NET Core 3.1.2。我的项目有enable . IEquatable 似乎发生了变化。现
我已经实现了IEquatable比较两个列表中的对象但是我想有条件地这样做: public bool Equals(CustomerType other) { if (this.Zipcode
我正在研究接口(interface)的类型,但我不明白如何使用 IEquatable 接口(interface)。 我认为它比直接使用a.Equals(b)提供了更好的性能,因为我们避免了拳击...我
嗯,我遇到了 IEquatable (C#) 的问题。正如您在下面的代码中看到的,我得到了一个实现了 IEquatable 的类,但是它的“Equals”方法无法实现。我的目标是:我的数据库中有一个日
我是一名优秀的程序员,十分优秀!