2017-10-08 3 views
0

J'ai une liste de tuples qui ressemble à ceci:Liste distincte sur les propriétés tuple

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

Les doubles valeurs représentent des valeurs X-Y-Z cooridinate et les chaînes sont certaines propriétés qui sont attachées à ces coordonnées.

Maintenant, je veux utiliser la méthode myList.lis.Distinct().ToList() pour filtrer les doublons. Après tout, 1 coordonnée peut être le début d'une ligne, tandis qu'une autre est l'extrémité d'une autre ligne, mais comme ils sont connectés, j'obtiens le point XYZ deux fois dans ma liste, mais avec d'autres propriétés de chaîne. Mais je veux seulement utiliser la Distinct sur les 3 valeurs doubles du Tuple et ignorer les chaînes. Jusqu'à présent, je n'ai pas encore compris comment le faire. Est-ce possible et comment?

+0

pas sûr pourquoi vous utilisez des tuples ici, avec 6 propriétés, vous certainement n eed une classe. –

Répondre

2

Créer une nouvelle classe et passer outre Equals méthode pour utiliser les coordonnées uniquement:

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

Merci, c'est vraiment utile. Je suppose que je peux également ajouter une instruction if pour la propriété dans le contrôle Equals? donc si les 2 coordonnées sont les mêmes, et que la propriété est différente, je veux toujours garder l'un "ArcStart" et non le "LineEnd"? – Dante1986

+0

@ Dante1986 oui, vous pouvez définir la méthode 'Equals' comme vous voulez – Backs

1

Vous pouvez utiliser la méthode DistinctBy dans la bibliothèque MoreLINQ.

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

Vous pouvez utiliser GroupBy méthode LINQ comme ceci:

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

Demo est here