2011-11-02 16 views
5

次のようなC#の行が次のような振る舞いをしない理由を説明できますか?IEnumerable Select

string [] strs = {"asdf", "asd2", "asdf2"}; 
strs.Select(str => doSomething(str)); 


foreach(string str in strs){ 
    doSomething(str); 
} 

私はdoSomething()の中にブレークポイントを置き、Selectでは起動しませんがforeachでは実行します。

TIA

+2

ような何かをする必要がありますbb548891.aspx)。 – ChaosPandion

+0

@ChaosPandion元のコメントははるかに優れていました。 ;) – Marc

+0

@Marc - 私はOPが遅延または実行の意味を知らないかもしれないので、もう少し外交的になりたいと思っていました。 – ChaosPandion

答えて

1

Linqクエリが処理されません、ToArray()

そして、あなたのforeachの文と等価である方法によって、このようなもの:

strs.ForEach(doSomething);

strs.ToList().ForEach(doSomething); 

または

Array.ForEach(strs, doSomething); 
+0

私はあなたがArray.ForEach(str、DoSomething)を意味すると仮定しています – dharga

+0

@dharga正しいですが、私は通常、テストせずにコードを書いているときに間違いを犯します。正しいバージョンは 'strs.ToList()です。ForEach (doSomething); 'または' Array.ForEach(strs、doSomething); ' – fardjad

+0

.Select()は遅延です。また、doSomething()は.Selectが(a - > b)を取るので、値を返さなければなりません。あるいは、.NETでは、<..>というアクションではなくFunc <..>が必要です。 – Daniel

10

これは、LINQクエリが遅延されているためです。 Selectメソッドに渡されたラムダは、結果にアクセスすると実際に実行されます。

試してください:などあなたがToList()を使用してEnumarableに変換するまで

string [] strs = {"asdf", "asd2", "asdf2"}; 
var result = strs.Select(str => doSomething(str)); 

foreach(var item in result) { 
} 
+0

私がこれに言いたいのは、ループ内のコレクションを変更する場合は、IEnumerableの代わりに反復処理する静的リストを使用する方が好きなことです。 – Gent

0

あなたが値を使用したら、私が思うに、あなたがdoSomethingの()と呼ばれるが表示されます選択から返されました。これがなぜ起こっているのかを確認するにはyieldをご覧ください。

1

あなたは、[ドキュメント](http://msdn.microsoft.com/en-us/library/で発言区間の最初のいくつかの単語をお読みください

string [] strs = {"asdf", "asd2", "asdf2"}; 
strs = strs.Select(str => doSomething(str)).ToArray(); 


foreach(string str in strs){ 
    doSomething(str); 
}