2

次のコード行を使用しています。

ListOfMyClass.OrderByDescending(x => x.DateCreated)
             .Where(x => !x.Deleted).First();

そして、私は得る

「最初の警告への単一の呼び出しに置き換えます」

私はどちらをしたいのですが、方法がわかりません。

最新の日付が作成され、削除されていないとマークされているアイテムについて言えるようにしたい.

私はきちんとしたコーダーになりたいので、この種のクエリを学ぶのに最適な場所と、これを解決する最良の方法はどこですか.

4

6 に答える 6

6

場所なしで呼び出すことができます:

ListOfMyClass.OrderByDescending(x => x.DateCreated).First(x => !x.Deleted);

First述語も受け入れます。あなたが書くかどうかは本当に問題ではなくWhereFirstこの場合Firstはまったく同じクエリに評価されます:)しかし、Firstよりきれいに見えます。

Jeroen van Langen が言ったようWhereに、 よりわずかに高速ですFirst。したがってWhere.OrderByDescending.First、これまでのところ、使用が最良のソリューションであると思います。

于 2013-10-01T08:59:26.533 に答える
5

インライン述語を受け入れるの他のオーバーロードを使用することは、単なる提案です。Firstこれにより、次のように置き換えることができ.Where(...).First()ます.First(...)

ListOfMyClass.OrderByDescending(x => x.DateCreated).First(x => !x.Deleted);

とはいえ、クエリを作成するさらに良い方法は次のとおりです。

ListOfMyClass.Where(x => !x.Deleted)
             .OrderByDescending(x => x.DateCreated)
             .First();

ここでは、上記の「コード記述の最適化」は適用されませんが、このバージョンでは並べ替えの前にフィルター処理されます。これにより、除外されるアイテムの割合によっては、並べ替えが大幅に高速化される可能性があります。単に無視しようとしている要素を並べ替えても意味がありません。

于 2013-10-01T08:59:25.633 に答える
2

警告を「満たす」には、次のように書き換えることができます。

ListOfMyClass.OrderByDescending(x => x.DateCreated)
             .First(x => !x.Deleted);

ただし、並べ替えの前にフィルタリングを行うことを好むので、これを使用します。

ListOfMyClass
             .Where(x => !x.Deleted)
             .OrderByDescending(x => x.DateCreated)
             .First();
于 2013-10-01T09:00:57.150 に答える
1

最初に置くWhereので、並べ替える項目が少なくなります。

ListOfMyClass.Where(x => !x.Deleted).OrderByDescending(x => x.DateCreated).First();

また、MoreLinq から MaxBy を使用することもできます

ListOfMyClass.Where(x => !x.Deleted).MaxBy(x => x.DateCreated);
于 2013-10-01T09:02:25.697 に答える
0
ListOfMyClass.Where(x=> !x.Deleted).OrderByDescending(x=>x.DateCreated).First();
于 2013-10-01T09:03:28.280 に答える
0

...作成され、削除済みとしてマークされている最新の日付...

最新の削除されたアイテムが必要な場合、なぜ non-deleted( !x.Deleted) を求めるのですか?

私はこれを提案します:

var yourClassOrNull = ListOfMyClass
    .Where(x => x.Deleted)
    .OrderByDescending(x => x.DateCreated)
    .FirstOrDefault();

これは読みやすく、安全で効率的です。order byFirstOrDefaultの条件に一致する最初のアイテムを返すので安全です。here のような参照型の場合、条件に一致するアイテムがない場合、デフォルト値が返されます。後で確認できます。WhereOrderByDescendingnullif(yourClassOrNull != null) ...

Linq-To-Objects でフィルタリングした後に注文することが重要なので効率的です。

于 2013-10-01T09:04:28.973 に答える