2016-07-06 5 views
2

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)); 

もちろん、私はこの質問を投稿する前に見ていたと私はエリックリペットのコメントへのリダイレクトこの

First Link

のようないくつかの素晴らしい情報を見つけました。そのほかに

foreach vs ForEach

私は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); 
       } 
+1

いいえ、それは間違いなく一般的に意見に基づいています。あなたの特定のケースでは、 'ToList'を呼び出すときにコードが不必要に非効率的になります。これは、結果を反復しただけで回避できますが、' List ' 。 –

+0

純粋な技術用語/議論を可能な限り固めていても? – icbytes

+0

はい、基本的に。 –

答えて

2

まず、私を聞かせてLINQが何であるかについて少し気をつけてください。

これはLINQです。言語統合クエリ。あなたは照会しています。読書。

(from t in tabControlOutput.TabPages.Cast<TabPage>() 
from c in t.Controls.OfType<WebBrowser>() 
select c).ToList() 

次はないです。技術的には、LINQ(拡張メソッドのセット)ではなく、List<T>クラスの通常のクラスメンバーです。そして哲学的には、これは照会ではありません。あなたが言ったクラスの.ForEachメソッドを呼び出すことができるように.ToList()へのあなたの呼び出しにのみ必要とされている

.ForEach(c => c.Navigate(Constants.BlankUrl)); 

:あなたはデータを操作あります。 LINQの結果に通常のforeachを使用した方が効率的です。

あなたの行は最初から明白なLINQではありません。実際にはデータを操作しています。これは普通のLINQだと思っているので驚くようなものかもしれないので、principle of least surpriseに違反しています。最後に、それだけではなく、foreach代替案よりも効率が悪いです。

+0

THX、非常に良い答え、意見の味がない。 – icbytes

関連する問題