4

私はLINQを学んでおり、次のリストから最も安い製品を見つけたいと思っています。

List<Product> products = new List<Product> { 
                new Product {Name = "Kayak", Price = 275M, ID=1}, 
                new Product {Name = "Lifejacket", Price = 48.95M, ID=2}, 
                new Product {Name = "Soccer ball", Price = 19.50M, ID=3}, 
            };

私は次のことを思いついたが、どういうわけかそれはそれを行うための最良の方法ではないように感じる:

var cheapest = products.Find(p => p.Price == products.Min(m => m.Price));

これを達成する正しい方法を教えていただけますか。

4

3 に答える 3

10

使用する必要があります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;                
    }
}

public staticこれをクラスのメソッドとして追加するだけです( EnumerableExtensions?)。

今、あなたは言うことができます

var cheapest = products.MinBy(x => x.Price);
于 2012-06-06T10:59:54.280 に答える
1

または、単にそれらを注文して最初の結果を取得することもできます。これは、値Productではなくオブジェクトの後にいることを前提としています。Priceそのようです。

var cheapestProduct = products.OrderBy(p => p.Price).FirstOrDefault();
var mostExpensiveProduct = products.OrderByDescending(p => p.Price).FirstOrDefault();
于 2012-06-06T10:58:10.107 に答える
0

最初に価格で注文してから、最初に選択する必要があります。

if(products.Any()){
    var productWithCheapestPrice = products.OrderBy(p => p.Price).First();
}
于 2012-06-06T10:59:18.047 に答える