2015-10-08 86 views
2

我試圖從包含泛型類的列表中刪除重複項。通用類看起來像這樣(剝去爲例):刪除包含泛型類的列表中的重複項

public class Point2D<T> 
{ 
    public T x; 
    public T y; 

    public Point2D(T x, T y) 
    { 
     this.x = x; 
     this.y = y; 
    } 
} 

,我已經創建的列表如下:

List<Point2D<int>> pointList = new List<Point2D<int>>(); 
pointList.Add(new Point2D<int>(1,1)); 
pointList.Add(new Point2D<int>(1,2)); 
pointList.Add(new Point2D<int>(1,1)); 
pointList.Add(new Point2D<int>(1,3)); 

我試圖通過刪除重複項:

pointList = pointList.Distinct().ToList(); 

期望pointList將只包含:(1,1),(1,2),(1,3),但它仍包含輸入的所有四個點。我懷疑我需要在Point2D中使用我自己的等號或比較器方法,但我不知道是這種情況,還是應該如何編寫它們(除非我只是錯過了一些簡單的東西)。

回答

4

要做到這一點,你需要重寫Equals方法:

public class Point2D<T> 
    { 
     public readonly T x; 
     public readonly T y; 

     public Point2D(T x, T y) 
     { 
      this.x = x; 
      this.y = y; 
     } 
     public override bool Equals(object obj) 
     { 
      if (ReferenceEquals(null, obj)) return false; 
      if (ReferenceEquals(this, obj)) return true; 
      if (obj.GetType() != this.GetType()) return false; 
      return Equals((Point2D<T>) obj); 
     } 

     protected bool Equals(Point2D<T> other) 
     { 
      return EqualityComparer<T>.Default.Equals(x, other.x) && EqualityComparer<T>.Default.Equals(y, other.y); 
     } 

     public override int GetHashCode() 
     { 
      unchecked 
      { 
       return (EqualityComparer<T>.Default.GetHashCode(x)*397)^EqualityComparer<T>.Default.GetHashCode(y); 
      } 
     } 
    } 

此外,你需要重寫GetHashCode。但要正確地做到這一點,你必須使你的xy只讀域

+0

好醇'resharper,呃? – Blorgbeard

+0

@Blorgbeard是的,它使這樣的thigs快速和容易 – Backs

+0

@Backs我不確定在GetHashCode方法,所以將不得不閱讀它,但這是讓我的單元測試通過。謝謝。 – Ayb4btu

-1

我建議重寫==運營商。 This應該有所幫助。

+1

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 – Bruce

+0

@布魯斯謝謝,我從現在開始一定會這樣做。 – ChaiNunes

3

您可以使用匿名對象。這將如何改變參考。所以只有當你不需要以前的參考時才使用它。

pointList = pointList.Select(x => new {x.x,x.y}).Distinct().Select(x => new Point2D<int>(x.x, x.y)).ToList(); 
+0

什麼是'new {x.x,x.y}'在做什麼?那是什麼類型? – Ayb4btu

+0

@ Ayb4btu具有隻讀屬性的自定義編譯時類型。 'new {x.x,x.y}'的名稱和類型由編譯器在編譯時生成。詳細瞭解匿名對象https://msdn.microsoft.com/zh-cn/library/bb397696.aspx –