2008-08-16 12 views
6

リストの変換を簡潔に表すので、リスト内包はPythonで大好きです。for配列の繰り返しの場合の置換...

しかし、他の言語で、私は頻繁に自分自身の線に沿って何かを書く見つける:

foreach (int x in intArray) 
    if (x > 3) //generic condition on x 
    x++ 
    //do other processing 

この例では、私はLINQはこれで助けることができる印象でだのC#、であるが、そこでありますこれよりもやや劣った解決策に取って代わることのできる一般的なプログラミング構成要素はありますか?おそらく私が検討していないデータ構造ですか?

答えて

5

インクリメント配列の内容には影響しません、元foreachループは、これを行うための唯一の方法は、forループのまま:

for(int i = 0; i < intArray.Length; ++i) 
{ 
    if(intArray[i] > 3) ++intArray[i]; 
} 

LINQのは、既存のコレクションや配列を修飾するものではありません。既存のシーケンスに基づいて新しいシーケンスを作成します。それは、その目的に対して僅かではあるが、それは、LINQのを使用して上記のコードを達成することが可能である:

where(または同等)を使用
var newArray1 = from i in intArray select ((i > 3) ? (i + 1) : (i)); 
var newArray2 = intArray.Select(i => (i > 3) ? (i + 1) : (i)); 

、他の回答の一部に示されるように、任意の値以下を除外します得られた配列から3まで。

var intArray = new int[] { 10, 1, 20, 2 }; 
var newArray = from i in intArray where i > 3 select i + 1; 
// newArray == { 11, 21 } 

メソッド呼び出し以上のもののために私はforeachに固執するでしょうが、あなたが、代わりにforeachブロックのラムダ関数を使用できるようになりますアレイ上ForEach方法があります。

intArray.ForEach(i => DoSomething(i)); 
-1

あなたがしなければならないことと、あなたが何をする必要があるかによって、多くの言語で呼ばれているような "地図"があなたが探しているものになる可能性があります。私はC#を知らないが、thisページに従って、.NET 2.0は "ConvertAll"マップを呼び出します。

"map"の意味は非常に単純です。リストをとり、その各要素に関数を適用して新しいリストを返します。また、別のリストの述語を満たす項目のリストを与える "フィルタ"を探しているかもしれません。 Rubyで

0

intArray.select { |x| x > 3 }.each do |x| 
    # do other processing 
end 

または

「その他の処理は、」短いワンライナーである場合:

intArray.select { |x| x > 3 }.each { |x| something_that_uses x } 

最後に、あなたは、処理の結果を含む新しい配列を返すようにしたい場合3より大きいそれらの要素:Pythonで

intArray.select { |x| x > 3 }.map { |x| do_something_to x } 
1

、あなたは、W、filter and mapを持っていますHICHは、あなたが望むように何ができる:

map(lambda x: foo(x + 1) filter(lambda x: x > 3, intArray)) 

list comprehensionsは1つの簡単な文で両方を行うことができますもあります:

[f(x + 1) for x in intArray if x > 3] 
2

C#では、あなたがこのようなIEnumerableを内側に住んでいる何に選択的処理を適用することができます。

intArray.Where(i => i > 3).ConvertAll(); 
DoStuff(intArray.Where(i => i 3)); 

など。中

0
map(lambda x: test(x + 1) filter(lambda x: x > 3, arr)) 
関連する問題