LINQ问题......需要获得具有最小值的元素

时间:2010-08-26 12:36:55

标签: c# linq

我是linq的新手,所以我还在努力....

我有一组控件(每个控件都有一个Point类型的位置)。 我需要从集合中删除具有最低Y值(顶部控件)的控件。

非常感谢一个例子!

6 个答案:

答案 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 ));