Tag: 等于

在可变类型中实现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 […]

C#中相等的最小代码

在本文中 ,Eric Lippert在第9点建议C#具有“太多平等”。 他指出,有9或10种不同的方法或运算符可以重载以提供对象相等性。 我的第一个问题是 – 如果重写了Object.Equals(object)方法,编译器是否可以调用任何其他相等运算符,如==,!=,<=等,而无需明确执行此操作的代码? 在C ++中,这种行为有先例。 编译器可以在需要生成临时变量的某些位置调用复制构造函数。 我至少95%肯定这不会发生在C#中,但它实际上取决于编译器的构造方式以及边缘情况。 第二个问题是 – 如果编译器永远不会间接调用任何相等运算符,那么小型,中型甚至大型项目是否可以指定只使用Object.Equals(object)方法和IEquatable来实现如果类型将用于排序或其他时间确定对象的等级需要使用等式测试和IComparable吗? 换句话说 – 如果项目中的每个人都同意他们不会被使用并因此是不必要的,那么可以避免定义其他相等运算符吗? 假设代码仅在项目中使用,不会导出供第三方使用。

Image和Bitmap类都没有实现自定义相等/哈希码逻辑的原因是什么?

从MSDN文档来看,似乎GetHashCode()和Equals()都没有在Bitmap中被覆盖。 它们都没有在Image中被覆盖。 所以这两个类都使用Object的版本只比较引用。 我不太相信所以我决定启动Reflector来检查它。 看来MSDN在这方面是正确的。 那么,为什么MS人员不会实现“比较逻辑”,至少对于Bitmap类来说,有什么特别的原因吗? 我发现它对于Image来说是可以接受的,因为它是一个抽象类,但对于Bitmap类来说并非如此。 我可以看到在很多情况下计算哈希码可能是一个昂贵的操作,但如果它使用某种缓存它就没问题。 想要比较2个位图时,我是否不得不依靠比较每个像素来运行图片? 谢谢

C#Assert.AreNotEqual与Equals

在尝试validation自己时,对于IEnumerables的C#Equals是一个引用等于,我发现了一些奇怪的东西。 在NUnit中进行以下设置 var a = (IEnumerable)(new[] { “one”, “two” }); var b = (IEnumerable)(new[] { “one”, “two” }); 这个测试 Assert.IsFalse(a.Equals(b)); 通过,而这个测试 Assert.AreNotEqual(a, b); 没有。 任何人都可以解释原因吗? 编辑:谢谢你的回答。 我刚刚阅读了NUnit的文档,它说同样的事情,AreEqual和AreNotEqual with collections测试集合中每个元素的相等性。 我想我坚持这个概念,AreEqual和AreNotEqual只是使用普通的Equals。

比较类型的VALUE和REFERENCE

我知道有很多方法可以比较C#中的VALUE和REFERENCES,但是当你尝试比较VALUE或REFERENCE时,我仍然对什么类型执行什么感到困惑。 字符串示例: string str = “hello”; string str2 = “hello”; if (str == str2) { Console.WriteLine(“Something”); } // Is this a comparison of value? if (str.Equals(str2)) { Console.WriteLine(“Something”); } // Is this a comparison of value? string.ReferenceEquals(str, str2); // Comparison of reference (True) Console.WriteLine((object)str1 == (object)str2); // Comparison of reference (True)

如何检查对象是否等于同一类的新对象?

如果我有一个像这样的对象: public class Person { public int id {get;set;} public string name {get;set;} } 我想要的行为: Person a = new Person(); Person b = new Person(); a == b; 并且a == b返回true,我是否必须覆盖Object.Equals()方法? 或者是否有其他方法可以不覆盖Equals方法? 编辑 我想比较数据,因为我想知道我调用的外部方法是否返回一个新对象或一个具有不同于新对象的数据的对象

位arrays相等

我需要比我的应用程序中的System.Collections.BitArray类更多的东西。 具体来说,我需要位数组: 是不可改变的 使用值语义实现相等性 我创建了自己的struct ,主要是复制BitArray实现的内部。 (谢谢, .Net Reflector !) 我不会每天处理按位操作,所以我对我的平等实现没有最高的信心。 (它正在通过我投掷的unit testing,但我可能会遗漏边缘情况。)我将我提出的解决方案作为下面的答案。 我会感谢别人的反馈和答案,可能更正确或更有效。 就像CLR BitArray , length字段指的是struct中的位数,而array字段(或Array属性)指的是表示位的32位整数数组。 [澄清]我选择在构造函数和其他方法中采用简单的路径,这样我就不能依赖于不必要的位为零。 例如, Not()通过整数数组元素上的按位求反( ~ )来实现。 可以使用构造函数,它使用length和boolean来初始化所有位。 如果初始化值为true,我将int数组的所有元素设置为-1(以二进制补码表示,由全1表示) 等等。 因此,我需要在比较中处理(或者更确切地说,忽略)它们。 一个很好的解决方案也是始终将这些位置零,但在我的情况下会导致更多的工作(对于计算机和我来说都是如此!)

Dictionary.Equals()有实现吗?

我有一个字典,我将其与另一个字典进行比较(变量类型为IDictionary)。 执行d1.Equals(d2)会产生错误。 在下面编写自己的代码会产生真实。 两者都是System.Collections.Generic.Dictionary 。 我错过了什么或者Dictionary没有比较键/值的Equals实现吗? private static bool DictEquals(IDictionary d1, IDictionary d2) { if (d1.Count != d2.Count) return false; foreach (KeyValuePair pair in d1) { if (!d2.ContainsKey(pair.Key)) return false; if (!Equals(d2[pair.Key], pair.Value)) return false; } return true; }

元组vs字符串作为C#中的字典键

我有一个使用ConcurrentDictionary实现的缓存,我需要保留的数据取决于5个参数。 所以从缓存中获取它的方法是:(为简单起见,这里仅显示3个参数,我更改了数据类型以表示CarData的清晰度) public CarData GetCarData(string carModel, string engineType, int year); 我想知道什么类型的密钥在我的ConcurrentDictionary中更好用,我可以这样做: var carCache = new ConcurrentDictionary(); // check for car key bool exists = carCache.ContainsKey(string.Format(“{0}_{1}_{2}”, carModel, engineType, year); 或者像这样: var carCache = new ConcurrentDictionary<Tuple, CarData>(); // check for car key bool exists = carCache.ContainsKey(new Tuple(carModel, engineType, year)); 我不会将这些参数一起用于任何其他地方,因此没有理由创建一个类来保持它们在一起。 我想知道哪种方法在性能和可维护性方面更好。

为什么listbox1.Items.Add使用我的对象的Equals方法?

我正在仔细检查Windows窗体ListBoxCollection添加方法,在分析过程中我发现方法“add”调用基础对象中的Equals方法为什么这个方法执行此操作? 我使用过“Call Stack”,我找到了这个答案: 我们调用:System.Windows.Forms.ListBox.ObjectCollection.Add(object item) 它将调用:System.Windows.Forms.ListBox.ObjectCollection.AddInternal(object item) 它将调用:System.Windows.Forms.ListBox.NativeAdd(object item) 它将调用:System.Windows.Forms.ListControl.GetItemText(object item) 它将调用:System.Windows.Forms.Formatter.FormatObject(object value,System.Type targetType,System.ComponentModel.TypeConverter sourceConverter,System.ComponentModel.TypeConverter targetConverter,string formatString,System.IFormatProvider formatInfo,object formattedNullValue,object dataSourceNullValue ) 它将调用:System.Windows.Forms.Formatter.IsNullData(object value,object dataSourceNullValue) 最后它将调用:object.Equals(object objA,object objB) 哪个方法也使我的等方法运行: WindowsFormsApplication1.Student.Equals(object obj) 和将发送到我的等于方法的最后一个参数(作为obj)是一个DBNULL对象! 什么是DBNULL?