4

可能重复:
LINQ:如何对集合中所有对象的属性执行 .Max() 并返回具有最大值的对象

我有以下课程:

class Product
{
    public string ProductName { get; set; }
    public DateTime ActivationDate { get; set; }
}

然后我创建并填充一个 List<Product>,我想ProductNameProduct最新的ActivationDate.

Product.Where(m => m.ActivationDate == Max(m.ActivationDate)).Select(n => n.ProductName)

Product.Max(m => m.ActivationDate).Select(n => n.ProductName)

但机器人方法不起作用。有人知道完成这项任务的方法吗?

4

6 回答 6

9

您可以OrderByDescendingList<Product>ActivationDate 字段上,然后采取FirstOrDefault()

Product.OrderByDescending(p => p.ActivationDate).FirstOrDefault();

对于更简单的版本,有一个扩展方法

MaxBy

Product.MaxBy(p => p.ActivationDate);
于 2012-07-17T10:35:11.247 回答
4

如果你能做到这一点:

class Product : IComparable<Product>
{
    public string ProductName { get; set; }
    public DateTime ActivationDate { get; set; }

    public int CompareTo(Product other)
    {
        return this.ActivationDate.CompareTo(other.ActivationDate);
    }
}

然后就是这样:

var max = products.Max(p => p).ProductName;
于 2012-07-17T10:44:16.473 回答
2

开始了; 单次通过列表:

public static TSource MaxBy<TSource,TValue>(
    this IEnumerable<TSource> source,
    Func<TSource,TValue> selector)
{
    using(var iter = source.GetEnumerator())
    {
        if (!iter.MoveNext())
            throw new InvalidOperationException("Empty sequence");
        var max = selector(iter.Current);
        var item = iter.Current;
        var comparer = Comparer<TValue>.Default;
        while(iter.MoveNext())
        {
            var tmp = selector(iter.Current);
            if(comparer.Compare(max, tmp) < 0)
            {
                item = iter.Current;
                max = tmp;
            }
        }
        return item;
    }
}

然后:

var maxObj = list.MaxBy(x => x.SomeProp);

这比做一个更有效OrderBy,例如,它需要对数据进行实际排序,而不是只扫描一次。

于 2012-07-17T10:48:37.883 回答
1

如何编写一个名为 Max 的扩展函数,它在内部执行 Branko Dimitrijevic 提出的简单搜索逻辑。

/// <param name="comparer">Func<T current, T currentMax, long> </param>
    public static T Max<T>(this List<T> collection, Func<T, T, long> comparer) where T : class
    {
        T max_product = null;
        collection.ForEach(c =>
        {
            if (max_product == null || comparer(c, max_product) > 0)
                max_product = c;
        });

        return max_product;
    }

将此函数称为:

string maxProductName = products.Max<Product>((currentProduct, currentMaxProduct) =>
        {
            // Basically any logic
            return currentMaxProduct.ActivationDate.CompareTo(currentProduct.ActivationDate);
        }).ProductName;
于 2012-07-17T12:42:34.773 回答
0

非 LINQ 解决方案很简单,如果您只需要在一个地方使用它,那么一般的MaxBy将是一种过度杀伤:

Product max_product = null;

foreach (var product in products) {
    if (max_product == null || max_product.ActivationDate < product.ActivationDate)
        max_product = product;
}

// Use `max_product`...
于 2012-07-17T11:01:22.137 回答
-2

试试这个

ProductList.Where(m => m.ActivationDate == ProductList.Max(pl => pl.ActivationDate)).FirstOrDefault().ProductName;
于 2012-07-17T10:37:54.443 回答