0

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を使用した方が高速になるはずです。

誰が正しいですか?

4

2 に答える 2

10

Select不適切です。何もフィルタリングしません。
if可能な解決策ですが、Where同様に明示的です。 Whereのように、アイテムごとに条件を 1 回だけ実行しますifWhereさらに、 への呼び出しはリストを反復しないことに注意することが重要です。したがって、 を使用Whereする場合と同様に、リストを 1 回だけ繰り返しますif

SelectLINQ を理解していない 1 人 (使用したい人) と、LINQ の機能面が気に入らない人と話し合っていると思います。

私は一緒に行きWhereます。

于 2013-01-17T10:40:27.933 に答える
1

.Where()if(condition)アプローチは同じになります。
しかし、LinQは読みやすいので、私はそれを好みます。

を使用したアプローチ.Select()は、Hazaa-Objectを返さないため、ナンセンスですが、IEnumerable<Boolean>

機能を明確にするために:

myEnumerable.Where(a => isTrueFor(a)) //This is filtering
myEnumerable.Select(a => a.b) //This is projection

Where()関数を実行します。この関数は、列挙可能なアイテムのブールforeachアイテムを返し、ブール関数の結果に応じてこのアイテムを返します。
Select()リスト内のすべてのアイテムに対して関数を実行し、フィルタリングを行わずに関数の結果を返します。

于 2013-01-17T10:45:41.597 に答える