Есть ли способ удалить определенные элементы из списка <T>с помощью LINQ? - PullRequest
2 голосов
/ 02 апреля 2012

У меня есть список объектов, которые заказаны.Я хотел бы удалить избыточные объекты, где избыточные не обязательно означают дублирование.Вот пример:

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 ]

1 голос
/ 02 апреля 2012

Редактировать : Это дает ожидаемый результат.Я группирую 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 голос
/ 02 апреля 2012

Как насчет этого?

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);                        
}
0 голосов
/ 02 апреля 2012

Как указывает название LINQ, его следует использовать только для запроса данных.

На вашем месте я бы не использовал LINQ для удаления или изменения списка.Я использую его только для запроса.

0 голосов
/ 02 апреля 2012

Вот моя попытка, она отлично работает, но код должен быть лучше:

 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));
 }
0 голосов
/ 02 апреля 2012

Я бы определил ваш собственный класс, заключающий в себе List<Point>, чтобы вы могли реализовать свою собственную логику, определяя, что является «избыточным» или другими правилами, которые вы хотите придерживаться.Кажется, это было бы более разумно, чем использование LINQ для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...