2016-11-18 113 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

相關問題