从List <t>获取具有特定属性</t>的最大值的记录

时间:2012-07-17 10:32:03

标签: c# linq max

  

可能重复:
  LINQ: How to perform .Max() on a property of all objects in a collection and return the object with maximum value

我有以下课程:

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

然后我创建并填充List<Product>,我希望ProductName获取最新Product的{​​{1}}。

ActivationDate

但是bot方法不起作用。有人知道实现这项任务的方法吗?

6 个答案:

答案 0 :(得分:6)

您可以在ActivationDate字段上OrderByDescending List<Product>,然后点FirstOrDefault()

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

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

MaxBy

Product.MaxBy(p => p.ActivationDate);

答案 1 :(得分: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;

答案 2 :(得分: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更有效,例如,它需要实际排序数据,而不是只扫描一次。

答案 3 :(得分: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`...

答案 4 :(得分:0)

如何编写一个名为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;

答案 5 :(得分:-2)

试试这个

ProductList.Where(m => m.ActivationDate == ProductList.Max(pl => pl.ActivationDate)).FirstOrDefault().ProductName;