2016-11-18 116 views
1

这是一些示例代码。我应该重写哪些方法来使用LINQ Where,Find?

我创造我自己的类:

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>(); 

我想使用它们,如:

myObjects.Where(mo => mo == inputObject).Sum(fo => fo.Value); 

等等。 (我相信我的列表中存在具有相同GUID的对象作为inputObject,这仅仅是一个示例代码)

的问题是:

如何使用LINQ查询,这个列表中的Sum,等等?

我应该重写哪些方法以便通过GUID进行比较,它们应该如何显示?

使用IEquatable和Equals()方法会更好吗?

+0

当您检查''==需要you'd覆盖'==' - 操作符,但是当您检查Equals时,您必须重写该方法。对于'Sum',您不需要重写,因为您已将该值汇总到委托中。 – HimBromBeere

+0

@HimBromBeere那么他们应该如何正确覆盖?我应该使用IEquatable for MyObject吗? –

+0

这取决于您的where子句的外观以及您在哪里调用的方法。这应该是重写的方法(也许这种方法依赖于Marc所指出的)。 – HimBromBeere

回答

2

由于您正在使用==进行检查,因此您需要提供==运算符(这也意味着您需要提供一个!=运算符)。否则,将会应用引用相等(因为它是一个类),并且:它不太可能是对象(只是一个等效对象)。

或者,您可以覆盖Equals并将您的测试更改为使用.Equals(注意:如果您这样做,也覆盖GetHashCode())。

更容易的选择,然而,可能是直接检查相关的内在价值,即

public string Guid => _guid; 

和:

.Where(mo => mo.Guid == inputObject.Guid) 
+0

不会'IEquatable '比运算符重载更好的选择吗?您可以重写'Equals()'来使用'IEquatable '实现。 – toadflakz

+0

@toadflakz当OP要使用==比较时,我们需要覆盖该运算符,在这种情况下实现接口不会做任何事情。 – HimBromBeere

+0

通过Guid搜索是最好的方法 – mayu

相关问题