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)