我有一个订购的对象列表。我想删除多余的对象,其中冗余不一定意味着重复。这是一个例子:
List<Point> points = new List<Point>
{
new Point(0, 10),
new Point(1, 12),
new Point(2, 16),
new Point(3, 16),
new Point(4, 16),
new Point(5, 13),
new Point(6, 16),
};
我有兴趣删除new Point(3, 16)
条目,因为它没有提供有用的信息;我已经知道2 = 16处的元素和4 = 16处的元素。 3 = 16的信息在我的应用程序中没有任何好处(因为我已经有了边界{2,4} = 16),所以我想删除该条目。我也不想,我想保留第5和第6个条目,因为没有连续的条目,其中Y = 16。
有没有一种方法可以用linq做到这一点?
答案 0 :(得分:1)
修改:这会为您提供预期的结果。我正在按List<Point>
对Point.X
(按Point.Y
排序)进行分组。然后我采取每组中的第一个和最后一个Point
:
var result = points.OrderBy(p => p.X)
.GroupBy(p => p.Y)
.Select(grp =>
grp.Where((p, index) => index == 0 || index == grp.Count() - 1))
.SelectMany(p => p).OrderBy(p => p.X)
.ToList();
答案 1 :(得分:1)
这个怎么样?
public void Test()
{
List<Point> points = new List<Point>
{
new Point(0, 10),
new Point(1, 12),
new Point(2, 16),
new Point(3, 16),
new Point(4, 16),
new Point(5, 13),
new Point(6, 16),
};
var subSetOfPoints = points.Where(p=> !IsInTheMiddleX(p, points));
}
private bool IsInTheMiddleX(Point point, IEnumerable<Point> points)
{
return points.Any(p => p.X < point.X && p.Y == point.Y) &&
points.Any(p => p.X > point.X && p.Y == point.Y);
}
答案 2 :(得分:0)
我定义了自己的包装List<Point>
的类,以便您可以实现自己的逻辑,定义什么是“冗余”或您希望遵守的其他规则。看起来这比使用LINQ处理这个更加明智。
答案 3 :(得分:0)
这是我的尝试,它工作正常,但代码需要更好:
var distinctY = points.Select(p => p.Y).Distinct().ToList();
List<Point> filtered = new List<Point>();
foreach (var y in distinctY)
{
int minX, maxX;
minX = points.Where(p => p.Y == y).Min(x => x.X);
maxX = points.Where(p => p.Y == y).Max(x => x.X);
filtered.Add(new Point(minX, y));
if ( maxX != minX)
filtered.Add(new Point(maxX, y));
}
答案 4 :(得分:0)
正如LINQ所指示的那样,它应该仅用于查询数据。
如果我是你,我不会使用LINQ来删除或修改List。我只用它来查询它。