2010-10-21 6 views
2

У меня есть список Datapoints (List).Взятие отдельного элемента из списка datapoints

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) 

Я хочу то есть удалить все другие точки, где значение X дубликатами.

Один из подходов, который у меня есть, - это перебрать всю точку и принять текущее значение точки x и сравнить его с остальной частью списка, если он равен другим значениям точек X, а затем удалить это значение.

Как я буду делать это с помощью LINQ или какой-либо метод расширения (Distinct)

+0

Вы могли бы показать, как вы их сохранили в своем списке сейчас? т.е. является ли это списком или, возможно, List >? –

+0

DataPoint является классом в System.Windows.Forms.DataVisualization.Charting. Итак, его список Mohit

ответ

3

Один подход с LINQ бы точками группы их X-координаты, а затем выбрать некоторый произвольный элемент из каждой группы производить выход.

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: Простой способ сделать это без LINQ:

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

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

var filtered = pointsByXCoord.Values; 
+0

Хотя это сработало для меня, будет ли это дорогостоящей операцией, чем вложенный foreach? – Mohit

+0

@Mohit: В принципе, этот подход должен быть намного быстрее, чем ваше первоначальное предложение. Однако единственный способ узнать это - измерить. – Ani

1

var enumerable = myList.Distinct() вернет IEnumerable<Datapoint> до тех пор, как Datapoint реализован интерфейс IEquatable<>.

Вот хорошая статья о требованиях к пользовательскому типу для того, чтобы иметь возможность использовать Distinct() расширения с помощью LINQ:

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

Если вам нужен список вместо с IEnumerableToList() расширения также предусмотрены.

0

Я думаю, что это лучшее решение:

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

, потому что только с xvalue DataPoint не является уникальным.

Смежные вопросы