从数据点列表中获取不同的项目

时间:2010-10-21 04:54:16

标签: c# linq generics

我有一份Datapoints(List)列表。

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)

3 个答案:

答案 0 :(得分: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();
编辑:没有LINQ的简单方法:

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

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

var filtered = pointsByXCoord.Values;

答案 1 :(得分:1)

只要Datapoint实施了var enumerable = myList.Distinct()接口,

IEnumerable<Datapoint>就会返回IEquatable<>

这是一篇关于自定义类型要求的好文章,以便能够使用LINQ的Distinct()扩展名:

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

如果您需要列表而不是IEnumerable,则还会提供ToList()分机。

答案 2 :(得分:0)

我认为这是更好的解决方案:

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

因为只有xvalue数据点不是唯一的。