我是linq的新手,所以我还在努力....
我有一组控件(每个控件都有一个Point类型的位置)。 我需要从集合中删除具有最低Y值(顶部控件)的控件。
非常感谢一个例子!
答案 0 :(得分:12)
这样的事情:
collection.Remove(collection.OrderBy(c => c.Location.Y).First());
订购非常昂贵,因此根据您的使用情况,您还可以找到价值最低的商品,然后将其删除:
collection.Remove(collection.First(c => c.Y == collection.Min(c2 => c2.Y)));
这列出最多三次的列表,通常这应该比OrderBy快,但如果性能对你很重要,那么先测量。
答案 1 :(得分:6)
您只需要找到该项并将其删除即可。删除非常清楚,但在查找时,您可以使用这样的聚合方法:
collection
.Remove(collection
.Aggregate((c1, c2) => c1.Point.Y < c2.Point.Y ? c1 : c2)
)
);
答案 2 :(得分:4)
订购更贵。只需获得最小值。
var lowest = (from c in collection
where c.X == collection.Min(i => i.X)
select c).FirstOrDefault();
collection.Remove(c);
答案 3 :(得分:0)
请记住, LINQ 代表语言INtegreated 查询。也就是说,它可以用作查询工具,而不是修改集合。
也就是说,您可以使用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);
答案 4 :(得分:0)
下面是一个扩展方法,允许您选择min元素而不是min值。您可以这样使用:
var lowest = collection.MinElement(x => x.Y);
然后您可以使用collection.Remove(lowest)
删除元素。
public static T MinElement<T>(this IEnumerable<T> source, Func<T, int> selector) {
if (source == null) {
throw new ArgumentNullException(nameof(source));
}
int minValue = 0;
T minElement = default(T);
bool hasValue = false;
foreach (T s in source) {
int x = selector(s);
if (hasValue) {
if (x < minValue) {
minValue = x;
minElement = s;
}
} else {
minValue = x;
minElement = s;
hasValue = true;
}
}
if (hasValue) {
return minElement;
}
throw new InvalidOperationException("MinElement: No elements in sequence.");
}
答案 5 :(得分:-1)
collection.Remove( collection.Min( c => c.Y ));