Tag: equals

C#SortedSet 和相等

我对SortedSet的行为有点疑惑,请看下面的例子: public class Blah { public double Value { get; private set; } public Blah(double value) { Value = value; } } public class BlahComparer : Comparer { public override int Compare(Blah x, Blah y) { return Comparer.Default.Compare(x.Value, y.Value); } } public static void main() { var blahs = new List {new Blah(1), new Blah(2), […]

C#:静态object.Equals如何检查是否相等?

假设你有两个不同的类,每个类都有自己的Equals实现; 使用哪一个? 如果只有一个人有一个怎么办? 或者都没有? 以下任何一行是否相同? object .Equals( first, second ) first .Equals( second ) second .Equals( first ) 我猜测前两个可能是等价的,但我真的不知道。 它到底是做什么的?

如何在匿名类型上实现Equals和GetHashCode?

帮助说: 匿名类型是直接从对象派生的类类型,不能转换为除object之外的任何类型。 编译器为每个匿名类型提供名称,尽管您的应用程序无法访问它。 从公共语言运行库的角度来看,匿名类型与任何其他引用类型没有区别。 如果程序集中的两个或多个匿名对象初始值设定项指定了具有相同顺序且具有相同名称和类型的属性序列,则编译器会将对象视为相同类型的实例。 它们共享相同的编译器生成的类型信息。 因为匿名类型上的Equals和GetHashCode方法是根据属性的Equals和GetHashCode方法定义的,所以同一匿名类型的两个实例只有在它们的所有属性相等时才相等。 这些都是真的,但是怎么样? 参考源明确地显示了如何比较对象( ReferenceEquals )和“直接从对象派生”的类型不能具有这种特殊行为。 它与ValueType的Equals行为也不匹配。 那怎么办? 匿名类型如何覆盖Equals()和GetHashCode()而没有任何可见的覆盖?

应该什么时候.NET类覆盖等于()? 什么时候不应该?

VS2005文档重载等于()和操作符==(C#编程指南)的指南部分说明 不建议在非不可变类型中覆盖operator ==。 较新的.NET Framework 4文档实现等于和等式运算符(==)的指南省略了该语句,尽管社区内容中的一篇post重复了断言并引用了旧文档。 似乎至少对于一些琐碎的可变类来重写Equals()是合理的,例如 public class ImaginaryNumber { public double RealPart { get; set; } public double ImaginaryPart { get; set; } } 在数学中,具有相同实部和相同虚部的两个虚数实际上在测试相等性的时间点是相等的。 声明它们不相等是不正确的,如果具有相同RealPart和ImaginaryPart的单独对象未被覆盖Equals(),则会发生这种情况。 另一方面,如果一个覆盖Equals(),则还应覆盖GetHashCode()。 如果将覆盖Equals()和GetHashCode()的ImaginaryNumber放在HashSet中,并且可变实例更改其值,则不再在HashSet中找到该对象。 MSDN是否不正确删除有关不重写Equals()和operator==的非不可变类型的准则? 为可变类型重写Equals()是否合理,其中“在现实世界中”所有属性的等价意味着对象本身是相等的(与ImaginaryNumber )? 如果它是合理的,当对象实例参与HashSet或依赖于GetHashCode()的其他东西没有改变时,如何最好地处理潜在的可变性? UPDATE 刚刚在MSDN中遇到过这个问题 通常,当期望将类型的对象添加到某种类型的集合时,或者当它们的主要目的是存储一组字段或属性时,实现值相等。 您可以根据类型中所有字段和属性的比较来定义值相等,或者可以将定义基于子集。 但无论是哪种情况,还是在类和结构中,您的实现都应遵循等效的五个保证:

如何快速检查两个数据传输对象在C#中是否具有相同的属性?

我有这些数据传输对象: public class Report { public int Id { get; set; } public int ProjectId { get; set; } //and so on for many, many properties. } 我不想写 public bool areEqual(Report a, Report b) { if (a.Id != b.Id) return false; if (a.ProjectId != b.ProjectId) return false; //Repeat ad nauseum return true; } 有没有更快的方法来测试两个只有属性的对象是否具有相同的值(每个属性不需要一行代码或一个逻辑表达式?) 切换到结构不是一种选择。