C# 我应该重写哪些方法来使用LINQ Where,Find?
下面是一些示例代码 我创建了自己的类:C# 我应该重写哪些方法来使用LINQ Where,Find?,c#,linq,overriding,C#,Linq,Overriding,下面是一些示例代码 我创建了自己的类: public class MyObject { private string _guid; public int Value; // other stuff here... public MyObject() { _guid = Guid.NewGuid().ToString(); } } 我有一些我以前创建的对象和其他对象的列表,例如: MyObject inputObject
public class MyObject {
private string _guid;
public int Value;
// other stuff here...
public MyObject() {
_guid = Guid.NewGuid().ToString();
}
}
我有一些我以前创建的对象和其他对象的列表,例如:
MyObject inputObject = new MyObject();
List<MyObject> myObjects = new List<MyObject>();
等等。(我确信在我的列表中有一个与inputObject具有相同GUID的对象,这只是示例代码)
问题是:
如何在此列表中使用LINQ Find、Where、Sum等
我应该重写哪些方法以按GUID进行比较,它们应该是什么样子
使用IEquatable with Equals()方法是否更好?因为您正在使用
=
进行检查,所以需要提供=
运算符(这也意味着您需要提供!=
运算符)。否则,将应用引用相等(因为它是一个类),并且:它不太可能是相同的对象(只是一个等价的对象)
或者,您可以覆盖Equals
,并将测试更改为使用.Equals
(注意:如果这样做,还可以覆盖GetHashCode()
)
然而,一个更简单的选择可能是直接检查相关的内部值,即
public string Guid => _guid;
以及:
当您检查
==
时,您需要覆盖=
-运算符,但是当您检查等于时,您必须覆盖该方法。对于Sum
您不需要任何重写,因为您已经将要聚合的值放入委托中。@HimBromBeere那么应该如何正确重写它们呢?我应该为MyObject使用IEquatable吗?这取决于where子句的外观以及调用的方法。这一个应该是重写的方法(可能是这个方法所依赖的一些方法,正如Marc指出的)。IEquatable
(与方法的接口)在很大程度上与==
(操作符)无关;如果添加一个Equals(MyObject)
方法并重写Equals(object)
,那么实现IEquatable
是一个很好的实践,但它不会对问题中的代码产生任何影响way@MarcGravell使用IEquatable更好吗,就像在我的代码中一样,我多次比较MyObject?难道IEquatable
不是比运算符重载更好的选择吗?您可以重写Equals()
以使用IEquatable
实现。@toadflakz当OP想要使用==
进行比较时,我们需要重写该运算符,在这种情况下实现接口不会起任何作用。按Guid搜索是最好的方法
public string Guid => _guid;
.Where(mo => mo.Guid == inputObject.Guid)