2013-09-30 99 views
0

如果我試圖做到這一點 - 我的電話oldList.Except(newList)似乎返回所有項目 - 沒有比較工作。爲什麼不工作時,我已經定義IEqualityComparer <T>

List<ControlAndTopLevelControlPair> oldOnly = oldList.Except(newList).ToList(); 

    public class ControlAndTopLevelControlPair : IEqualityComparer<ControlAndTopLevelControlPair> 
    { 
     public int CONTROLOI { get; set; } 
     public int VIEWCONTROL_OI { get; set; } 
     public bool Equals(ControlAndTopLevelControlPair x, ControlAndTopLevelControlPair y) 
     { 
     return x.CONTROLOI.Equals(y.CONTROLOI) && x.VIEWCONTROL_OI.Equals(y.VIEWCONTROL_OI); 
     } 

     public int GetHashCode(ControlAndTopLevelControlPair obj) 
     { 
     return obj.CONTROLOI.GetHashCode()^obj.VIEWCONTROL_OI.GetHashCode(); 
     } 

但是如果我定義了一個自定義比較,則以下工作:

List<ControlAndTopLevelControlPair> oldOnly = oldList.Except(newList, new ControlAndTopLevelControlPairComparer()).ToList(); 

    public class ControlAndTopLevelControlPairComparer : IEqualityComparer<ControlAndTopLevelControlPair> 
    { 
     public bool Equals(ControlAndTopLevelControlPair x, ControlAndTopLevelControlPair y) 
     { 
     return x.CONTROLOI.Equals(y.CONTROLOI) && x.VIEWCONTROL_OI.Equals(y.VIEWCONTROL_OI); 
     } 

     public int GetHashCode(ControlAndTopLevelControlPair obj) 
     { 
     return obj.CONTROLOI.GetHashCode()^obj.VIEWCONTROL_OI.GetHashCode(); 
     } 
    } 

回答

2

IEqualityComparer是你定義一個對象是誰的唯一的工作就是比較一些其他對象接口。

您可以使用IEquatable對象來定義對象與另一個對象的比較本身的方式。如果你這樣做,那麼你不需要創建一個新的比較器對象並將它傳遞到Except

確保您每次執行IEquatble時都覆蓋對象的GetHashCode方法。

public class ControlAndTopLevelControlPair : IEquatable<ControlAndTopLevelControlPair> 
{ 
    public int CONTROLOI { get; set; } 
    public int VIEWCONTROL_OI { get; set; } 
    public bool Equals(ControlAndTopLevelControlPair other) 
    { 
     if (other == null) return false; 
     return CONTROLOI.Equals(other.CONTROLOI) 
      && VIEWCONTROL_OI.Equals(other.VIEWCONTROL_OI); 
    } 
    public override bool Equals(object obj) 
    { 
     return Equals(obj as ControlAndTopLevelControlPair); 
    } 
    public override int GetHashCode() 
    { 
     return CONTROLOI.GetHashCode()^VIEWCONTROL_OI.GetHashCode(); 
    } 
} 

如果你要覆蓋GetHashCode你也應該覆蓋對象的Equals方法,以便平等留在同步的兩個定義。

1

您需要overrideEqualsGetHashCode在第一種情況。

public class ControlAndTopLevelControlPair { 
    public int CONTROLOI { get; set; } 
    public int VIEWCONTROL_OI { get; set; } 
    public override bool Equals(object x) 
    { 
    ControlAndTopLevelControlPair c = x as ControlAndTopLevelControlPair; 
    if(c == null) return false; 
    return c.CONTROLOI.Equals(CONTROLOI) && c.VIEWCONTROL_OI.Equals(VIEWCONTROL_OI); 
    } 

    public override int GetHashCode() 
    { 
    return CONTROLOI.GetHashCode()^VIEWCONTROL_OI.GetHashCode(); 
    } 
} 

注意override關鍵字,類並不需要實現IEqualityComparer

2

當你不指定的Comparer,它會默認調用GetHashCodeEquals(object),你不執行。

如果你在你的方法中放置一個斷點,你會發現它們從來沒有被調用過。如果您對GetHashCode()Equals(object)的實施做相同的處理,則會看到那些被調用的爲

public class ControlAndTopLevelControlPair 
{ 
    public int CONTROLOI { get; set; } 
    public int VIEWCONTROL_OI { get; set; } 

    public override int GetHashCode() { return CONTROLOI^VIEWCONTROL_OI; } 
    public override bool Equals (object other) 
    { 
    // your implementation 
    } 
} 
+0

從OP代碼複製粘貼的另一個產品? 'IEqualityComparer ...'不需要,否則你必須添加實現該接口的代碼。 –

相關問題