4

重複の可能性:
LINQ: コレクション内のすべてのオブジェクトのプロパティに対して .Max() を実行し、最大値を持つオブジェクトを返す方法

私は次のクラスを持っています:

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

次に、 a を作成して入力 します。最新のからList<Product>を取得したいと思います。ProductNameProductActivationDate

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

ActivationDate フィールドを使用OrderByDescendingして、List<Product>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

Branko Dimitrijevic によって提示された単純な検索ロジックを内部的に実行する Max という拡張関数を作成するのはどうでしょうか。

/// <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 ソリューションは十分に簡単です。1 か所だけで必要な場合は、一般的な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 に答える