Tag: equals

联合两个自定义类会返回重复项

我有两个自定义类, ChangeRequest和ChangeRequests ,其中ChangeRequests可以包含许多ChangeRequest实例。 public class ChangeRequests : IXmlSerializable, ICloneable, IEnumerable, IEquatable { … } public class ChangeRequest : ICloneable, IXmlSerializable, IEquatable { … } 我试图做两个ChangeRequests实例的联合。 但是,似乎没有删除重复项。 我的MSTestunit testing如下: var cr1 = new ChangeRequest { CRID = “12” }; var crs1 = new ChangeRequests { cr1 }; var crs2 = new ChangeRequests { cr1.Clone(), new ChangeRequest […]

在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 […]

使用IEqualityComparer和Equals / GethashCode Override有什么区别?

当我使用字典有时我必须更改默认的等于意思,以便比较键。 我看到如果我覆盖键的类上的Equals和GetHashCode,或者我创建了一个实现IEqualityComparer的新类,我有相同的结果。 那么使用IEqualityComparer和Equals / GethashCode Override有什么区别? 两个例子: class Customer { public string name; public int age; public Customer(string n, int a) { this.age = a; this.name = n; } public override bool Equals(object obj) { Customer c = (Customer)obj; return this.name == c.name && this.age == c.age; } public override int GetHashCode() { return (this.name […]

比较在Dictionary中用作Key的对象

我的课: public class myClass { public int A { get; set; } public int B { get; set; } public int C { get; set; } public int D { get; set; } } 和主要的例子: Dictionary<myClass, List> dict = new Dictionary<myClass, List>(); myClass first = new myClass(); first.A = 2; first.B = 3; myClass second […]

在visual studio中找到所有与==的比较

我犯了错误,使用==来比较IP地址,而不是使用C#中IPAddress类的equals()方法,这将导致引用而不是值的比较。 由于我目前正在处理的解决方案对于单人项目(> 100.000行源代码)而言非常大,我非常确定我的代码中仍然存在一些错误的语句。 有没有可能告诉Visual Studio为我查找特定类的所有==操作,以便我可以找到并清理错误的比较? 最诚挚的问候,emi

List .Contains和T 。包含不同的行为

说我有这个class: public class Animal : IEquatable { public string Name { get; set; } public bool Equals(Animal other) { return Name.Equals(other.Name); } public override bool Equals(object obj) { return Equals((Animal)obj); } public override int GetHashCode() { return Name == null ? 0 : Name.GetHashCode(); } } 这是测试: var animals = new[] { new Animal { […]

Equals,GetHashCode,EqualityComparers和模糊平等

对于具有属性A,B,C,D,StartDate和EndDate的对象,如果我想实现任何两个对象相等的东西,如果它们具有相同的A,B和C以及重叠的日期范围,那将如何完成? 我试过像这样创建一个EqualityComparer public override bool Equals(RateItem x, RateItem y) { bool equal = true; if ((xA != yA || xB != yB || xC != yC || (x.StartDate < y.StartDate && x.EndDate y.StartDate && y.EndDate <= x.StartDate))) { equal = false; } return equal; } 但似乎框架中的很多地方都忽略了Equals并使用了GetHashCode,文档根本就不清楚。 当我去实现GetHashCode时,我不知道如何在不忽略日期的情况下使HashCodes变得相同。 为了使其更具体,这与项目管理和费率有关。 我想实现一个业务规则,即同一个角色中同一个项目中的同一个人在同一时间段内不能有不同的费率。 因此Bob在Project DeathMarch中担任DBA角色,在任何给定时间只能有一个有效的账单费率来记录他的时间。 如果他需要在同一时间段内以不同的速率记录QA分析师的角色,那就没问题。 这是一个庞大的预先存在的系统,因此更改域对象结构不是一种选择。

System.Collections.Generic.List 的等于方法……?

我正在创建一个派生自List的类… public class MyList : List {} 我已经覆盖了MyListItem的Equals … public override bool Equals(object obj) { MyListItem li = obj as MyListItem; return (ID == li.ID); // ID is a property of MyListItem } 我想在MyList对象中也有一个Equals方法,它将比较列表中的每个项目,在每个MyListItem对象上调用Equals()。 简单地打电话会很好… MyList l1 = new MyList() { new MyListItem(1), new MyListItem(2) }; MyList l2 = new MyList() { new MyListItem(1), new […]

T 。包含struct和class的行为方式不同

这是一个后续问题: List .Contains和T []。包含不同的行为 T[].Contains当T是类和结构时, T[].Contains的行为不同。 假设我有这个结构 : public struct Animal : IEquatable { public string Name { get; set; } public bool Equals(Animal other) //<- he is the man { return Name == other.Name; } public override bool Equals(object obj) { return Equals((Animal)obj); } public override int GetHashCode() { return Name == null ? […]

比较Double和Int的最佳方法是什么?

C#中的以下代码不起作用: int iValue = 0; double dValue = 0.0; bool isEqual = iValue.Equals(dValue); 那么,问题是:比较Double和Int的最佳方法是什么?