2016-05-26 3 views
-1

私はC#を初めて使い、辞書にあらかじめ作成されたこの機能を紹介しました。ここで/ lambdaとeachの使用の違い

_objDictionary.Keys.Where(a => (a is fooObject)).ToList().ForEach(a => ((fooObject)a).LaunchMissles()); 

私の理解では、これは基本的にリストにfooObjectあるすべてのキーを置くことで、各のLaunchMissles機能を実行します。このようにループごとにaを使うのとどう違うのですか?

編集:機能的な違いはないと思われます。

+1

異なるコーディング方法。開発者が各要素をループするのは一種のレガシーな方法です。マイクロソフトのループスルーは現代的な方法です:) – techspider

+3

'このように各ループにaを使用するのとどのように違いますか? 'あなたのバージョンはもっと読みやすくなります..また、良いブログを読むにはhttps://blogs.msdn.microsoft.com/ericlippert/2009/05/18/foreach-vs-foreach/ – Eser

+0

それはスタイルの違い以上のものではありません。 – AntiTcb

答えて

3

これは、LINQを濫用する良い例です。文は、他の方法では読みやすく、優れたものにはなりませんでしたが、LINQをどこにでも置くような人もいます。あなたのforeachの例では、あなたがLaunchMisslesを呼び出すためにFooObjectにキャストを不足していることを

foreach(var entry in _objDictionary.Keys.OfType<FooObject>()) 
{ 
    entry.LaunchMissles();  
} 

注:けれども、この場合には、あなたが行うことで、両方の世界から最高のかかる場合があります。

1

一般的に、LinqはVoodomagicではなく、あなたがそれを使用していなかった場合に書く必要がある同じものをフードの下に置きます。有利な

foreach(var entry in _objDictionary.Keys) 
{ 
    fooObject foo = entry as fooObject; 
    if (foo != null) 
    { 
     foo .LaunchMissles(); 
    } 
} 
をLINQのは、単に書くことが、物事が容易になりますが(それは本当に同等であれば)それはあなたのケースでは賢明な

を通常のコードのパフォーマンスを打つ文句を言わない、あなたの「オールドスクール」のアプローチは完全に罰金ですし、私の意見では

Linq-Approachに関して:

上記のコードと同様に、リスト上のメソッドを呼び出すだけで、シーケンスをマテリアライズすると、リソースを無駄にして読みにくくなります。

あなたの例では、diffrenceを作成しませんが、ソースがCollection(Dictionary.Keysのようなもの)ではなく、実際に怠惰な方法で動作するIEnumerableなら、大きな影響があります。

Lazy evalutationは、必要なときにアイテムを生成するように設計されています。ToList inbetweenを呼び出すと、実際にForEachを実行する前にすべてのアイテムが収集されます。 明白なforeachアプローチは1つのアイテムを取得し、それを処理してから次のように取得します。

あなたは本当にまだ

public static class EnumerableExtensionMethods 
{ 
    public static void ForEach<T>(this IEnumerable<T> sequence, Action<T> action) 
    { 
     foreach(T item in sequence) 
      action(item); 
    } 
} 

次にリスト・インプリメンテーションを使用してはいけないよりも、「LINQの-foreachの」を使用しますが(自分のquesiton以下のコメントで述べたように)自分自身のextensionmethodをロールバックしたい場合あなたが別の方法で「私のために許容される」これを使用する方法のみです

sequence.ForEach(_methodThatDoesThejob); 

へのforeach-体を入れない限り、通常のforeachの圧延は、好まれるべきです。

+0

" old school "を" new school "でさらに凝縮できることを忘れないでください。これは機能的に同等のC#6' foreach(_objDictionary.Keysのvarキー) 。 '(fooObjectとしてのエントリ)?LaunchMissles()' –

+0

RightとthatsはLinq-Statementよりもさらに短くなります。 – CSharpie

関連する問題