LINQクエリで2つの "where "句または"&&"を使用する必要がありますか?
質問
LINQクエリで複数の"and"条件を記述する場合、1つの"and"条件を記述すればよいのでしょうか。
where
節に
&&
または複数の
where
節が必要でしょうか?
static void Main(string[] args)
{
var ints = new List<int>(Enumerable.Range(-10, 20));
var positiveEvensA = from i in ints
where (i > 0) && ((i % 2) == 0)
select i;
var positiveEvensB = from i in ints
where i > 0
where (i % 2) == 0
select i;
System.Diagnostics.Debug.Assert(positiveEvensA.Count() ==
positiveEvensB.Count());
}
の間に、個人的な好みやコーディングスタイル(長い行や読みやすさなど)以外の違いはあるのでしょうか? positiveEvensA と positiveEvensB ?
思いつく違いの1つは、LINQプロバイダによって、複数の
where
より複雑な式ではなく、複数の
どのように解決するのですか?
私は個人的には、文が意味不明にならない限り、常に && と2つの where 節を使うことにしています。
あなたの場合、おそらくまったく気づかないでしょうが、2 つの where 節を持つことは、大きなコレクションを持っている場合、そしてこのクエリからすべての結果を使用する場合、間違いなくパフォーマンスに影響を与えるでしょう。 たとえば、結果に対して .Count() を呼び出したり、リスト全体を繰り返し処理したりすると、最初の where 節が実行され、新しい IEnumerable<T> が作成され、2 番目の委譲を使用して再び完全に列挙されます。
2つの句を連結することで、クエリは1つのデリゲートとなり、コレクションが列挙されるときに実行されるようになります。 この結果、コレクションの列挙は1回となり、結果が返されるたびにデリゲートが1回呼び出されることになります。
これらを分割すると、状況は変わります。 最初のwhere節が元のコレクションを列挙すると、2番目のwhere節はその結果を列挙します。 これにより、潜在的に(最悪の場合)、コレクションを2回完全に列挙し、メンバーごとに2つのデリゲートを呼び出すことになり、この文は(理論的には)実行速度が2倍になる可能性があることを意味します。
2 つの where 節を使用することにした場合、より制限の多い節を最初に配置すると、2 番目の where 節は最初の節を通過した要素に対してのみ実行されるため、かなり助けになります。
さて、あなたのケースでは、これは問題ではないでしょう。 大規模なコレクションでは、問題になる可能性があります。 一般的な経験則として、私は次のようにします。
-
読みやすさと保守性
-
性能
この場合、どちらの選択肢も同じように保守可能だと思うので、よりパフォーマンスの高い選択肢を選ぶと思います。
関連
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない
-
[解決済み] LINQ: フィルタリング基準で SingleOrDefault と FirstOrDefault() を使用する場合
-
[解決済み] DataTableに対するLINQクエリ
-
[解決済み] LINQで.Firstと.FirstOrDefaultを使用するタイミングは?
-
[解決済み] C#では、文字列の初期化にはstring.EmptyとString.Emptyと""のどちらを使えばいいのでしょうか?
-
[解決済み] LINQ を使用して、ある List<> にある項目を別の List<> にない項目として取得する。
-
[解決済み] LINQを使用して、プロパティ値の最小または最大値を持つオブジェクトを選択する方法
-
[解決済み] LINQとLambdaでJoin/Whereを実現する
-
[解決済み] LINQ Orderby Descending Query(LINQ降順クエリ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み】WebResource.axdとは何ですか?
-
[解決済み] LINQ拡張メソッドによる複数のWHERE句の作成