2011-02-23 114 views
2

我有這樣的代碼:平等比較對象

public bool AreSame(CreditProposal creditProposal) 
    { 
     if (!ContractingParty.Equals(creditProposal.ContractingParty)) 
      return false; 
     if (!UltimateParent.Equals(creditProposal.UltimateParent)) 
      return false; 
     if (!Rebound.Equals(creditProposal.Rebound)) 
      return false; 
     if (!ContactPerson.Equals(creditProposal.ContactPerson)) 
      return false; 
     if (!DateOfVisit.Equals(creditProposal.DateOfVisit)) 
      return false; 
     .... and so on 10 more times 

有沒有辦法做到這一點更簡潔?或者這是否意味着我陷入了沉思?

+0

你可以重寫CreditProposal上的相等運算符嗎? – Nick 2011-02-23 09:35:10

回答

4

重寫Equals方法。

檢查this on MSDN

同時注意If you implement ==, you must implement !=

+3

如果你重寫'Equals()',[也覆蓋GetHashCode()](http://stackoverflow.com/questions/371328/why-is-it-important-to-override-gethashcode-when-equals-method -is-overriden-in-c/371348#371348) – 2011-02-23 09:45:24

+0

@Marc指出,它需要我理解你的答案的邏輯;) – 2011-02-23 09:47:08

2

處理這種情況的本能方法是覆蓋Object.Equals(Object)方法併爲您的類型實施IEquatable<T>

但是,覆蓋Object.Equals將提示您也覆蓋Object.GetHashCode(),這是很難做到正確。最值得注意的是,GetHashCode()每次在同一個實例上調用它時都必須返回相同的值,並且必須返回兩個相等的值。如果你的類型是可變的,這將成爲一個真正的痛苦。 (事實上​​,GetHashCode()是如此難以正確實現,還有它整個標籤上的StackOverflow:https://stackoverflow.com/questions/tagged/gethashcode

Equals靜態實現通常是這樣的:

public static bool Equals(CreditProposal proposalA, CreditProposal proposalB) 
{ 
    // Check whether both values are null. 
    if(object.ReferenceEquals(proposalA, null) 
     && object.ReferenceEquals(proposalB, null)) 
    { 
     return true; 
    } 

    // Check whether either value is null. 
    if(object.ReferenceEquals(proposalA, null) 
     || object.ReferenceEquals(proposalB, null)) 
    { 
     return false; 
    } 

    // Check whether hashcodes are different. 
    if(proposalA.GetHashCode() != proposalB.GetHashCode()) 
    { 
     return false; 
    } 

    // Check for value equality. 
    return Party.Equals(
      proposalA.ContractingParty, 
      proposalB.ContractingParty) 
     && ParentProposal.Equals(
      proposalA.UltimateParent, 
      proposalB.UltimateParent); 
     // Add more conditions for equality here. 
} 

你會調用此實施你所有的實例方法。