2017-10-08 46 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

相关问题