11

DateTimeからプロパティの値が最も高いオブジェクトを取得する場合IEnumerableは、次のように実行できます。

var maxDate = myEnumerable.Max(x => x.TheDateTimeProperty);
var wantedObject = myEnumerable.FirstOrDefault(x => x.TheDateTimeProperty == maxDate);

これは最初のものを取得せずに可能maxDateですか?たとえば、次のようになります。

var wantedObject = myEnumerable.GetByMaxDate(x => x.TheDateTimeProperty);

拡張メソッドを記述できることは知ってGetByMaxDateいますが、linqによって提供されるメソッドがすでに存在するかどうかを知りたいです。

明確にするために:これを書くための他の可能性を探していません。それを行う方法が存在するかどうかだけに興味がありました。(コードが少なく、メソッドによって管理される可能な限り最高のパフォーマンス)

4

3 に答える 3

13

プロ:「任意の」linqプロバイダー(オブジェクト、エンティティ、SQL)で動作する必要があります

myEnumerable.OrderByDescending(x => x.TheDateTimeProperty).First();

短所:Matthew Watsonがコメントで指摘しているように、(非常に)大きなリストではパフォーマンスが低下します。

于 2013-03-11T09:41:35.470 に答える
2

あなたが最初に述べたように、私は最初にmaxDateを取得することを好みます。すでに使用している構文を使用しても問題はありません。

ただし、必要に応じて、次のようにコードを省略できます。

var wantedObject = myEnumerable.FirstOrDefault(x => x.TheDateTimeProperty == myEnumerable.Max(x => x.TheDateTimeProperty));

(このコードはテストされていません。おそらく何らかの型キャストが必要です)

または、ストアドプロシージャを記述して、そこからデータを取得することもできます。

ただし、OrderByDescending.Firstはもう好きではありません。テーブル内のデータが、指定されたプロパティで昇順で物理的に並べ替えられている場合は問題ありません。ただし、そうでない場合は、SQLテーブルで降順の並べ替えを行う必要があり、おそらくそこから高い負荷がかかります。特に、テーブルに1mを超えるレコードがあり、DateTimeが物理的に昇順で格納されている場合。

maxを使用すると、それよりも優れた(高速/軽量)結果が得られます。

于 2013-03-11T09:49:07.540 に答える
0

他に答えはなく、 linqには組み込みメソッドが存在しないため、使用するものを書き留めておきます。

オブジェクトへのlinqの場合:

コメントでHabibによって言及されたmorelinqMaxByからの方法。

linq to sqlの場合:

私は拡張メソッドを書きます:

public static TSource SqlMaxBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> selector)
{   
  var maxValue = source.Max(selector);
  return source.FirstOrDefault(value => selector(value).Equals(maxValue));
}
于 2013-03-14T12:10:30.193 に答える