2010-10-21 2 views
2

J'ai une liste de points de données (liste).Prendre un article distinct de la liste des points de données

e.g 

original list 
(1,2) 
(2,2) 
(1,3) 
(3,3) 
(4,3) 
(2,3) 
(5,4) 

I want a output list as 

(1,2) 
(2,2) 
(3,3) 
(4,3) 
(5,4) 
or 

(1,3) 
(3,3) 
(4,3) 
(2,3) 
(5,4) 

i.e Je souhaite supprimer tous les autres points où la valeur X est dupliquée. Une approche que j'ai est de faire une boucle sur tout le point et de prendre le point x valeur actuelle et de le comparer avec le reste de la liste si elle est égale à d'autres points valeur X puis supprimer cette valeur.

Comment puis-je faire en utilisant LINQ ou une méthode d'extension (Distinct)

+0

pourriez-vous montrer comment vous les avez stockés dans votre liste maintenant? c'est-à-dire, est-ce une Liste ou peut-être Liste >? –

+0

DataPoint est une classe de System.Windows.Forms.DataVisualization.Charting. Donc, sa liste Mohit

Répondre

3

Une approche avec LINQ serait de points de groupe par leurs coordonnées X, puis choisir parmi un certain point arbitraire de chaque groupe pour produire le résultat.

var filtered = myList.GroupBy(point => point.XValue) // point's bucket depends on its X 
        .Select(group => group.First()) //pick first item from each bucket 
        .ToList(); 

EDIT: Une façon simple de ce faire sans LINQ:

var pointsByXCoord = new Dictionary<double, DataPoint>(); 

foreach(var point in myList) 
    pointsByXCoord[point.XValue] = point; 

var filtered = pointsByXCoord.Values; 
+0

Bien que cela a fonctionné pour moi, sera-t-il une opération coûteuse qu'une imbriquée foreach ?? – Mohit

+0

@Mohit: En principe, cette approche devrait être beaucoup plus rapide que votre suggestion originale. La seule façon de le savoir est de mesurer, cependant. – Ani

1

var enumerable = myList.Distinct() retourne un IEnumerable<Datapoint> aussi longtemps que le Datapoint a mis en œuvre l'interface IEquatable<>.

Voici un bel article sur les exigences pour le type personnalisé afin de pouvoir utiliser Distinct() extension à partir LINQ:

http://blogs.msdn.com/b/csharpfaq/archive/2009/03/25/how-to-use-linq-methods-to-compare-objects-of-custom-types.aspx

Si vous avez besoin d'une liste au lieu d'une IEnumerable une extension ToList() est également fourni.

0

je pense qu'il est la meilleure solution:

var filtered = 
myList.GroupBy(point => 
point.XValue.ToString() + "," point.YValue[0].ToString()).Select(group => group.First 
()).ToList(); 

car avec seulement xvalue point de données est pas unique.

Questions connexes