当您不能覆盖平等时,如何比较两个对象?
我有一个类型CalculationModel的对象modelNoBend,我将其序列化为JSON,并使用以下内容将其保存在.txt文件中: private static void GenerateTextFileNoBend(string path, CalculationModel model) { if (!File.Exists(path)) { using (var file = File.CreateText(path + "noBend.txt")) { var json = JsonConvert.SerializeObject(model); file.Write(json); } } } 然后,我想对该JSON进行审查,并与原始对象一起检查它们是否相同. static void Main(string[] args) { GenerateTextFileNoBend(path,
18 2024-04-26
编程技术问答社区
关于==用于引用的警告(Visual Studio或ReSharper)。
根据==操作员的文档>, 对于字符串以外的参考类型,==如果其两个操作数是指同一对象. 但是,老实说,我从不检查两个引用是否与==. 我更喜欢使用ReferenceEquals(obj1, obj2),因此默认替代Equals函数也是如此. 因此,在我的项目中,当==运算符在其他类型上以外的其他类型上使用时,等于错误. 是否有一种方法可以通过视觉工作室或重音器触发警告/错误时==在参考上使用(除字符串外)? ? 解决方案 根据建议,我创建了一个扩展程序来做到这一点. 如果您有兴趣,这是指向源代码的链接. 目前它确实 检查对象是否对操作员" =="和"!="是否具有覆盖.想要贡献的人非常欢迎这样做. 其他解决方案 这不是一个全局解决方案,但是如果我们只考虑某些类,JetBrains.Annotations JetBrains.Annotations CannotApplyEqualityOperatorAttribute可以做到.
20 2024-04-25
编程技术问答社区
C# 记录类型: 记录子类之间的等价比较
给定父记录类型: public record Foo(string Value); 和两个记录子类和Bee我想知道是否可以在基类中实现Equals,因此作为foo,bar或bee的实例都被视为等于>基于Value(均使用Equals和==). 消化后我尝试了以下操作 https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-9.0/records public record Foo(string Value) { public virtual bool Equals(Foo? other) { return other != null && this.Value == other.Value; } public override int GetHashCod
6 2024-04-23
编程技术问答社区
在C#中实现平等的最小代码
在此 eric lippert 第9点C#具有"太多平等".他指出,有9或10种不同的方法或操作员可以超载以提供对象平等. 我的第一个问题是 - 如果object.equals(object)方法被覆盖,编译器是否有可能调用任何其他等价运算符,例如==,!=, 在C ++中,这种行为有先例.编译器可以在需要生成临时变量的某些地方调用复制构造函数.我至少有95%的人确定在C#中不会发生这种情况,但这确实取决于编译器的构建方式以及边缘案例. 第二个问题是 - 如果编译器永远不会间接调用任何相等性运算符,那么对于只有object(object)方法和iquabalable,一个小型,媒介甚至大型项目都可以用于平等测试,如果需要在确定需要对象等级时将类型用于排序或其他时间?换句话说 - 如果项目中的每个人都同意不使用并且不必要,避免定义其他平等操作员吗? 假设该代码仅在项目中使用,并且不会导出第三方使用. 解决方案 如果Object.Equals(object)方
22 2024-04-20
编程技术问答社区
实现IEqualityComparer<T>,用于比较任何类(包括匿名)的任意属性
我正在编写实现IequalityComparer的整洁类,以便我可以将任何匿名类型传递给它(或实际上具有属性的任何类型),并且它将通过比较类型的属性值来自动比较类型. public class CompareProperty : IEqualityComparer { private Type type; private PropertyInfo propInfo; private string _fieldName; public string fieldName { get; set; } public CompareProperty(string fieldName) { this.fieldName = fieldName; }
12 2024-04-20
编程技术问答社区
C#字符串平等运算符返回错误,但我很确定它应该是真的...... 什么?
我正在尝试为一件生成大量文本的代码编写单元测试.我遇到了一个问题,即"预期"和"实际"字符串似乎是平等的,但是断言. GetHashCode()的结果对于两个值也不同. 但是,将两个字符串放入文本文件中并与Diffmerge进行比较告诉我它们相同. 此外,在两个值上使用Encoding.ASCII.GetBytes(),然后使用SequenceEquals比较结果字节阵列返回true. 每个值每个是34kb,所以我现在将它们放在这里.有任何想法吗?我完全被困了. 解决方案 您要馈入Diffmerge的文件的编码类型是什么?如果您的字符与编码类型不匹配,那么他们就有可能不会出现在Diffmerge中. 正在生成的字符串和预期的结果可能具有不同的字符编码.当您进行ASCII.GetBytes时,您将所有内容转换为ASCII.因此,您的字符串被转换为ASCII,并且在ASCII字符集方面相等.但是,它们在其他角色集中仍然可能不平等(与您"看起来"相同).
10 2024-04-20
编程技术问答社区
值等价和循环引用:如何解决无限递归?
我有一些包含多个字段的类.我需要按值比较它们,即,如果它们的字段包含相同的数据,则类别的两个实例相等.我已经覆盖了GetHashCode和Equals方法. 可能会发生这些类包含循环引用. 示例:我们想对机构进行建模(例如政府,体育俱乐部等).一个机构有名字. A Club是一个具有名称和成员列表的机构.每个成员都是一个具有名称和最喜欢的机构的Person.如果某个俱乐部的成员将这个俱乐部作为他最喜欢的机构,我们有一个循环参考. 但是,圆形引用与价值平等结合,导致无限递归.这是一个代码示例: interface IInstitution { string Name { get; } } class Club : IInstitution { public string Name { get; set; } public HashSet Members { get; set; } public override int G
12 2024-04-19
编程技术问答社区
在LINQ中确定具有分钟精度的Datetime值的平等性
我需要比较两个日期时间值,以确定平等(完全相同),使用分钟精度.这是否是最好的方法?我的日期可能有几秒钟和毫秒,但我只想下来直到几分钟. where (Math.Abs(datetime1.Subtract(datetime2).TotalMinutes) == 0) 解决方案 检查Math.Abs(diff.TotalMinutes) == 0是否不这样做,不 - 这是在检查它们是否完全相同. 您是要检查它们是否具有同一分钟,还是相距不到一分钟?对于第一个,使用: where RoundToMinute(dateTime1) == RoundToMinute(dateTime2) 声明: public static DateTime RoundToMinute(DateTime time) { return new DateTime(time.Year, time.Month, time.Day,
16 2024-04-19
编程技术问答社区
匿名类型的平等性
当用来比较匿名类型时,为什么等于()和==的语义会有所不同?为什么一个人比较值和另一个比较参考?它背后的原因是什么? 解决方案 ==不调用Equals,它寻找==超载运算符.由于匿名类型没有超载==运算符,因此C#对其使用参考比较. ,但使用Equals它比较字段值.这就是为什么==和Equals之间的结果不同的原因. 匿名类型(C#编程指南) 因为匿名类型上的等于和gethashcode方法是 根据平等和gethashcode方法定义 属性,相同匿名类型的两个实例仅相等 如果它们的所有属性都相等.
14 2024-04-19
编程技术问答社区
在C#中检查值图元是否相等的正确方法?
给定两个类型(int, int)的变量,我如何检查它们是否表示相等的值? 例如: var a = (1, 2); var b = (1, 2); var c = a == b; // Error CS0019 Operator '==' cannot be applied to operands // of type '(int, int)' and '(int, int)' 该比较意味着如何在C#7中进行?我应该改用.Equals还是其他方式? 解决方案 在C#7.3之前,您有两个选择:使用.Equals,或者您可以写出==比较长手,因为本身支持==的元素: (a, b).Equals((c, d)) // true if a.Equals(c) && b.Equals(d) a == c && b == d // works if the types support == 在Equals()的工作方式,查看源.)
24 2024-04-18
编程技术问答社区
为什么这段代码会抛出一个InvalidOperationException?
我认为我的代码应该使ViewBag.test属性等于"No Match",但是它抛出了InvalidOperationException. 为什么这是? string str = "Hello1,Hello,Hello2"; string another = "Hello5"; string retVal = str.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries) .First(p => p.Equals(another)); if (str == another) { ViewBag.test = "Match"; } else { ViewBag.test = "No Match"; //this does not happen when it should } 解决方案 您可以看到在这里,First方法C2>当称为空的序列为空时.由于拆
20 2024-04-18
编程技术问答社区
LINQ:在不同类型的集合上使用.Except(),使它们可转换/可比较?
给定两个不同类型的列表,是否可以使这些类型可转换或彼此可比(例如使用TypeConverter或类似)使LINQ查询可以比较它们?我已经看到了其他类似的问题,但是没有什么可以指出使彼此之间的类型可转换以解决问题. 收集类型: public class Data { public int ID { get; set; } } public class ViewModel { private Data _data; public ViewModel(Data data) { _data = data; } } 所需用法: public void DoMerge(ObservableCollection destination, IEnumerable data) { // 1. Find items in data that don't alre
10 2024-04-18
编程技术问答社区
为什么((object)(int)1).Equals(((object)(ushort)1)会产生错误?
我的情况是我有一个object,我想用另一个object. 检查平等 public static bool Equals(object a, object b) { return a.Equals(b); } 当a = 1 (integer)和b = 1 (ushort (or basically not integer))时发生问题.我想知道这是否不应该产生true,但确实返回false ... 编辑 使情况更糟的是: Hashtable ht = new Hashtable(); ht.Add((int)1, "SOME STRING"); ht.Add((short)1, "SOME STRING"); ht.Add((long)1, "SOME STRING"); 我认为值" 1"只能允许一次. 解决方案 Int32.Equals(object) Int32.Equals(object) 仅在当时才返回true另一个对象也是Int32
6 2024-04-18
编程技术问答社区
元组 == 混乱
假设我定义了两个元组: Tuple tuple1 = new Tuple(1.0f, 2.0f, 3.0f, 4.0f); Tuple tuple2 = new Tuple(1.0f, 2.0f, 3.0f, 4.0f); 如果我尝试比较元组,我会得到不同的结果 bool result1 = (tuple1 == tuple2); // FALSE bool result2 = tuple1.Equals(tuple2); // TRUE 我希望两个呼叫都返回true. ==比较什么? 解决方案 对于元组,==正在比较对象引用,因为它没有 Overload == operator.由于对象是等效的,但不是相同的特定实例,Equals(
12 2024-04-17
编程技术问答社区
Resharper建议:检查参考文献是否平等。
我不明白为什么Resharper建议我在此代码中"检查参考平等": if ( typeToTranslate.Equals( typeof(string) ) ) { //do something } 为什么应该更好: typeToTranslate == typeof(string) -------------编辑--------------- 这是方法存根: protected IType TranslateType(Type typeToTranslate) { if (typeToTranslate == null) throw new ArgumentNullException("typeToTranslate"); //do some stuff if (typeToTranslate.Equals(typeof(string))) { //do some stuff }
12 2024-04-17
编程技术问答社区
使用IEqualityComparer和Equals/GethashCode Override之间有什么区别?
当我使用字典时,有时我必须更改默认的等于含义以比较键.我看到,如果我在钥匙类上覆盖了平等和gethashcode,或者创建了一个实现iequalityComparer的新类,则我的结果相同.那么,使用iequalityComparer和等于/GethashCode覆盖有什么区别? 两个例子: 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;
20 2024-04-17
编程技术问答社区
测试是否与默认值相等
以下未编译: public void MyMethod(T value) { if (value == default(T)) { // do stuff } } 错误:Operator '==' cannot be applied to operands of type 'T' and 'T' 我不能使用value == null,因为T可能是一个结构. 我不能使用value.Equals(default(T)),因为value可能是null. 测试默认值的相等性的正确方法是什么? 解决方案 为了避免为struct/Nullable拳击,我将使用: if (EqualityComparer.Default.Equals(value,default(T))) { // do stuff } 这支持任何实现IEquatable的T,使用object.Equals作为备份,并自动使用
12 2024-04-17
编程技术问答社区
C#对象比较
有人可以指出超载operator==进行深对象比较的想法(而不是参考比较). 来自MSDN: 默认情况下,操作员==通过确定两个引用是否指示同一对象来测试参考平等.因此,参考类型不必实现操作员==才能获得此功能.当一种类型是不可变的时,即无法更改实例中包含的数据,超载操作员==比较值平等而不是参考等值是有用的,因为作为不可变的对象,可以将它们视为相同因为它们具有相同的价值.在非易碎类型中覆盖操作员==这不是一个好主意. 什么时候实际上会受益? ,例如,如果每个对象都有方法Equals,则可以使价值比较,为什么有人会使用 value (不是参考)比较>语句? 我想我不明白什么,因为这对我来说看起来很奇怪. 解决方案 超载==操作员允许您编写x == y,它比x.Equals(y)更自然,即使x为null. 其他解决方案 超载操作员==仅改善代码的可读性.始终使用.equals()作为您定义的类型,尤其是用于深度对象比较. 其他解决方案
14 2024-04-16
编程技术问答社区
等于int和short c#返回false
考虑此代码: static int x2 = 10; public static void Main() { short y = 10; Console.WriteLine(y.Equals(x2)); //False Console.Read(); } 为什么y.Equals(x2)返回false? 解决方案 Int16.Equals特定文档 返回值 true如果OBJ是INT16的实例,并且等于此实例的值;否则,false. 这是我的原始答案,虽然它不适用,但我将其留在了.Equals方法正在检查 的情况下. 来自 docs 等于(对象)方法测试参考等效 其他解决方案 来自文档,您可以阅读使用的特定过载: 返回一个值,指示此实例是否等于指定的对象. 和: true如果OBJ是system.int16的实例,并且等于此实例的值;否则,false. a short不是int,所以
12 2024-04-16
编程技术问答社区
NUnit'的CollectionAssert对自定义类的类似列表返回false
这是我的班级: public class MyClass { public string Name { get; set; } public string FaminlyName { get; set; } public int Phone { get; set; } } 然后我有两个类似的列表: List list1 = new List() { new MyClass() {FaminlyName = "Smith", Name = "Arya", Phone = 0123}, new MyClass() {FaminlyName = "Jahani", Name = "Shad", Phone = 0123} }; List list2 = new List() { new MyClass() {FaminlyName = "Smith", Nam
10 2024-04-16
编程技术问答社区