一覧

2017-10-08 2 views
0

私はこのように見えるタプルのリストを有する:一覧

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

二重値はX-Y-Z cooridinate値を表し、および文字列は、これらの座標に取り付けられている特定の特性です。

ここでは、myList.lis.Distinct().ToList()メソッドを使用して重複を除外したいと考えています。結局のところ、1つの座標が行の始点になることがありますが、もう1つは別の行の終点ですが、それらが接続されているので、私のリストでポイントXYZポイントを2回取得します。 しかし、私はタプルの3つのdouble値でDistinctを使い、文字列を無視したいだけです。

これまでのところ、私はまだそれをどうやって理解していません。これは可能なのでしょうか?

+0

ではないはずですなぜ6つのプロパティを持つタプルをここで使用しているのですか?クラスをeedしました。 –

答えて

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つの座標が同じで、プロパティが異なる場合、私は常に "LineEnd"ではなく "ArcStart"を保持したいのですか? – Dante1986

+0

@ Dante1986はい、好きなように 'Equals'メソッドを定義することができます – Backs

1

ライブラリで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