2017-10-08 45 views
0

我有一個元組列表,看起來像這樣:名單上的元組性質不同

List<Tuple<double, double, double, string, string, string>> myList;

雙值表示X-Y-Z cooridinate值和字符串是附加到這些座標某些屬性。

現在我想使用myList.lis.Distinct().ToList()方法來篩選出任何重複。畢竟,一個座標可以是一條線的開始,而另一個座標可以是另一條線的終點,但是當它們連接時,我在列表中獲取點XYZ點兩次,但是具有其他字符串屬性。 但我只想對Tuple的3個double值使用Distinct並忽略這些字符串。

到目前爲止我還沒有想出如何去做。這是可能的,以及如何?

+0

不知道爲什麼你在這裏使用元組,有6個屬性,你絕對是n去上一堂課。 –

回答

2

創建新類並覆蓋Equals方法只使用座標:

class Point 
{ 
    public double X { get; set; } 
    public double Y { get; set; } 
    public double Z { get; set; } 
    public string Property1 { get; set; } 

    public override bool Equals(object obj) 
    { 
     return Equals(obj as Point); 
    } 

    protected bool Equals(Point other) 
    { 
     return X.Equals(other.X) && Y.Equals(other.Y) && Z.Equals(other.Z); 
    } 

    public override int GetHashCode() 
    { 
     unchecked 
     { 
      var hashCode = X.GetHashCode(); 
      hashCode = (hashCode * 397)^Y.GetHashCode(); 
      hashCode = (hashCode * 397)^Z.GetHashCode(); 
      return hashCode; 
     } 
    } 
}   
+0

謝謝,這真的很有用。我假設我也可以在Equals檢查中添加一個if語句的屬性?所以如果2個座標相同,並且屬性不同,我總是希望保留一個「ArcStart」而不是「LineEnd」? – Dante1986

+0

@ Dante1986是的,您可以根據需要定義「Equals」方法 – Backs

1

您可以在MoreLINQ庫中使用DistinctBy方法。

points.DistinctBy(c => new {c.Item1, c.Item2, c.Item3}).ToList(); 
1

您可以使用GroupBy LINQ方法是這樣的:

var result = myList.GroupBy(x => new {x.Item1, x.Item2, x.Item3}) 
    .Select(x => x.First()) 
    .ToList(); 

演示是here

相關問題