async/await、Task、BackgroundWorker、Threadのような4つのモニタクラス/アプローチの主な違いを使いこなしていたので、これら4つのアプローチ/オブジェクトとやりとりするコントロールをいくつか作成しました。 私は同時にLINQ/LAMBDAを掘り下げたいと思っていましたが、このような成功したLINQ文を書くことができました。LINQ +ラムダvs.標準インデクサ+ foreach - MSとLippertでさえ、インデクサが優れていると言います。そして、この場合は?
(from t in tabControlOutput.TabPages.Cast<TabPage>()
from c in t.Controls.OfType<WebBrowser>()
select c).ToList().ForEach(c => c.Navigate(Constants.BlankUrl));
もちろん、私はこの質問を投稿する前に見ていたと私はエリックリペットのコメントへのリダイレクトこの
のようないくつかの素晴らしい情報を見つけました。そのほかに
私はLINQは、標準的な指示の代わりに、LINQによって発行することができ、標準的なオペレーションにいくつかのオーバーヘッドを提供するのを認識しています、オーバーヘッド問題はMSフォア特定の理由のようだ、なぜにこだわります標準LINQレス処理ですが、E.Lippertには特にForEachを参照するいくつかの引数があります。
私を混同しているように見えるいくつかのステートメント、あります
が.... の目的式は、副作用を引き起こすことがない、値を計算することです。ステートメントの の目的は、副作用を引き起こすことです。
プログラミングの本、ベストプラクティスなどで聞いたことはありません。一般的な(そして私の)経験に従えば、副作用という用語は通常、喜んで達成される目的ではなく、恣意的な否定的な味を持っています。
E.Lippertの誰かがこの引用をclarifiyできますか?
さらに、E.Lippertによれば、いくつかの2行は維持するのが難しいようですが、私は受け入れないでしょう(これは意見に基づくかもしれません)。
しかし、私のコードについては、「醜い」唯一のものが「キャスト」であることがわかります。
したがって、合理的な理由(意見に基づくものではなく、純粋な技術用語、議論、制限的な陳述、原則(読みやすさもそれらに属します)、伝統的なforeachで置き換えるべきか、 ?あるいは反射
EDIT: 私は彼らにコメントすること自由に感じなさい、私のコードを変更し、私の前の行、作られたコメントを出しremmedし、これらの行を追加しました:
// ---> NOT RECOMMENDED APPROACH: Because LINQ is more designed to query, but at the end
// There is a modification of the queried objects, which
// Is not real LINQ, but a mix.
// And it violates the principles of least astonishment/surprise
// Changed to
var qresult = (from t in tabControlOutput.TabPages.Cast<TabPage>()
from c in t.Controls.OfType<WebBrowser>()
select c);
foreach (var tmp in qresult)
{
tmp.Navigate(Constants.BlankUrl);
}
いいえ、それは間違いなく一般的に意見に基づいています。あなたの特定のケースでは、 'ToList'を呼び出すときにコードが不必要に非効率的になります。これは、結果を反復しただけで回避できますが、' List ' 。 –
純粋な技術用語/議論を可能な限り固めていても? – icbytes
はい、基本的に。 –