IEnumerable (操作中に内容が変更されることはありません)に対する反復処理のセットアップについて、2 人の同僚と話し合いました。どちらが最適なアプローチであるかについて、3 つの相反する理論があります。他の2人とも(そして私も)非常に確実であり、それで確信が持てなくなったので、明確にするために、外部ソースで確認したいと思います.
シナリオは次のとおりです。出発点として以下のコードを使用したところ、一部のハザーは対処する必要がないことがわかりました。そのため、以下のコードから始めて、アクションのブロッカーの追加を開始しました。
foreach(Hazaa hazaa in hazaas) ;
私の提案は次のとおりです。
foreach(Hazaa hazaa in hazaas.Where(element => condition)) ;
そのうちの 1 人は、LINQ はこの場合には適切ではないと主張して、より明示的な形式で解決したいと考えています (なぜそうなるかはわかりませんが、彼は非常に確信しているようです)。彼の解決策はこれです。
foreach(Hazaa hazaa in hazaas) ;
if(condition) ;
もう 1 つの反対意見は、 Whereはフィルタリング プロセスを不必要に繰り返すリスクがあり、 Selectによって適切な要素を一度だけ選択することで計算負荷を最小限に抑えることがより確実であるという主張によってサポートされています。
foreach(Hazaa hazaa in hazaas.Select(element => condition)) ;
LINQ はデータ オブジェクトを非常にうまく処理できるため、最初の方法は時代遅れであると私は主張します。
また、この場合、 SelectはWhereと同等に高速であり、不要な手順は実行されないと考えています (たとえば、要素の条件の評価は 1 回だけ実行されます)。どちらかといえば、余分なインスタンスを作成しないため、Whereを使用した方が高速になるはずです。
誰が正しいですか?