Im new to linq so i still struggle ....
I have a collection of controls (each has a Location of type Point). Мне нужно удалить элемент управления с самым низким значением Y (верхний элемент управления) из коллекции.
Пример был бы очень полезен!
Что-то вроде этого:
collection.Remove(collection.OrderBy(c => c.Location.Y).First());
Сортировка довольно дорогая, поэтому в зависимости от вашего варианта использования вы также можете найти элемент с наименьшей стоимостью, а затем удалить его:
collection.Remove(collection.First(c => c.Y == collection.Min(c2 => c2.Y)));
Это перечисляет список до трех раз, как правило, это все равно должно быть быстрее, чем OrderBy, но если для вас важна производительность, сначала измерьте.
Вам просто нужно найти предмет и удалить его, это точно. Удалить очень понятно, но при поиске вы можете использовать метод Aggregate следующим образом:
collection
.Remove(collection
.Aggregate((c1, c2) => c1.Point.Y < c2.Point.Y ? c1 : c2)
)
);
Заказывать дороже. Просто получите минимальное значение.
var lowest = (from c in collection
where c.X == collection.Min(i => i.X)
select c).FirstOrDefault();
collection.Remove(c);
Помните, что LINQ означает Language INtegrated Query. То есть он предназначен для использования в качестве инструмента для запросов, а не для изменения коллекций.
Тем не менее, вы можете найти элемент управления, который нужно удалить, с помощью LINQ. Затем просто удалите его обычным способом.
// Let's say controls is a ControlCollection
var enumerable = controls.Cast<Control>();
int minimumY = enumerable.Min(c => c.Location.Y);
Control topControl = enumerable.Where(c => c.Location.Y == minimumY);
controls.Remove(topControl);