use LINQ to find the product with the cheapest value?

前端 未结 3 1869
梦谈多话
梦谈多话 2021-01-13 15:27

Im learning LINQ and I want to find the cheapest product from the following list:

List products = new List { 
                n         


        
相关标签:
3条回答
  • 2021-01-13 16:12

    You should use MinBy:

    public static TSource MinBy<TSource>(
        this IEnumerable<TSource> source,
        Func<TSource, IComparable> projectionToComparable
    ) {
        using (var e = source.GetEnumerator()) {
            if (!e.MoveNext()) {
                throw new InvalidOperationException("Sequence is empty.");
            }
            TSource min = e.Current;
            IComparable minProjection = projectionToComparable(e.Current);
            while (e.MoveNext()) {
                IComparable currentProjection = projectionToComparable(e.Current);
                if (currentProjection.CompareTo(minProjection) < 0) {
                    min = e.Current;
                    minProjection = currentProjection;
                }
            }
            return min;                
        }
    }
    

    Just add this as a method in a public static class (EnumerableExtensions?).

    Now you can say

    var cheapest = products.MinBy(x => x.Price);
    
    0 讨论(0)
  • 2021-01-13 16:22

    You need to order by the price first and then select the first.

    if(products.Any()){
        var productWithCheapestPrice = products.OrderBy(p => p.Price).First();
    }
    
    0 讨论(0)
  • 2021-01-13 16:27

    Alternatively, you could simply order them and take the first result, this is assuming you're after the Product object and not the Price value; like so.

    var cheapestProduct = products.OrderBy(p => p.Price).FirstOrDefault();
    var mostExpensiveProduct = products.OrderByDescending(p => p.Price).FirstOrDefault();
    
    0 讨论(0)
提交回复
热议问题