2011-02-23 96 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. 
} 

你会调用此实施你所有的实例方法。