有没有办法从List <t>中删除LINQ中的某些元素?</t>

时间:2012-04-01 22:43:57

标签: c# linq c#-4.0

我有一个订购的对象列表。我想删除多余的对象,其中冗余不一定意味着重复。这是一个例子:

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做到这一点?

5 个答案:

答案 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。我只用它来查询它。