我有一份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)
答案 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)
var enumerable = myList.Distinct()
接口, IEnumerable<Datapoint>
就会返回IEquatable<>
。
这是一篇关于自定义类型要求的好文章,以便能够使用LINQ的Distinct()
扩展名:
如果您需要列表而不是IEnumerable
,则还会提供ToList()
分机。
答案 2 :(得分:0)
我认为这是更好的解决方案:
var filtered =
myList.GroupBy(point =>
point.XValue.ToString() + "," point.YValue[0].ToString()).Select(group => group.First
()).ToList();
因为只有xvalue数据点不是唯一的。