1. ホーム
  2. c#

[解決済み】コレクション内の全オブジェクトのプロパティに対して.Max()を実行し、最大値を持つオブジェクトを返す方法【重複】。

2022-03-27 23:57:54

質問

2つのintプロパティを持つオブジェクトのリストがあります。このリストは、別の linq クエリの出力です。そのオブジェクトは

public class DimensionPair  
{
    public int Height { get; set; }
    public int Width { get; set; }
}

リストの中で最大の Height プロパティの値です。

の最高値はなんとか取れる。 Height の値を取得することはできますが、オブジェクトそのものを取得することはできません。

Linqでこれを行うことはできますか?どのように?

どのように解決するのですか?

私たちは 拡張メソッド でまさにこれを行う。 MoreLINQ . 実装はそちらをご覧いただくとして、基本的にはデータを繰り返し処理し、これまでに見た最大の要素と、それが投影の下で生成した最大の値を記憶しておくというものです。

あなたの場合、次のようなことをするのですね。

var item = items.MaxBy(x => x.Height);

これは、Mehrdadの2番目の解決策以外の、ここで紹介されたどの解決策よりも優れています(IMO)。 MaxBy ):

  • と違ってO(n)です。 前回の受付回答 これは、すべての反復で最大値を見つける(O(n^2)になる)。
  • 順序解はO(n log n)
  • を取ると Max の値からその値を持つ最初の要素を見つけるのは O(n) ですが、シーケンスを 2 回反復することになります。可能であれば、LINQはシングルパスで使用すべきです。
  • 集約版よりもずっと読みやすく、理解しやすく、投影の評価も要素ごとに一度だけである