12

Python のリスト内包表記は、リストの変換を簡潔に表すので、気に入っています。

ただし、他の言語では、次の行に沿って何かを書いていることがよくあります。

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

この例はC#であり、LINQがこれに役立つという印象を受けていますが、このエレガントではないソリューションを置き換えることができる一般的なプログラミング構造はありますか? おそらく私が考慮していないデータ構造ですか?

4

6 に答える 6

7

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

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

Linq は、既存のコレクションやシーケンスを変更することを意図していません。既存のシーケンスに基づいて新しいシーケンスを作成します。Linq を使用して上記のコードを実現することは可能ですが、その目的に少し反します。

var newArray1 = from i in intArray select ((i > 3) ? (i + 1) : (i));
var newArray2 = intArray.Select(i => (i > 3) ? (i + 1) : (i));

他のいくつかの回答に示されているように(または同等のものを)使用whereすると、結果のシーケンスから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));
于 2008-08-17T00:44:57.650 に答える
2

C# では、次のように IEnumerable 内に存在するものすべてに選択的な処理を適用できます。

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

等..

于 2008-08-16T23:06:52.013 に答える
1

Python では、filter と mapがあり、必要に応じて次のことができます。

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

1 つの簡単なステートメントで両方を実行できるリスト内包表記もあります。

[f(x + 1) for x in intArray if x > 3]
于 2008-08-16T22:56:30.863 に答える
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 より大きい要素の処理結果を含​​む新しい配列を返したい場合は、次のようにします。

intArray.select { |x| x > 3 }.map { |x| do_something_to x }
于 2008-08-16T22:47:53.953 に答える
0
map(lambda x: test(x + 1) filter(lambda x: x > 3, arr))
于 2011-06-25T11:28:54.993 に答える
-1

言語と何をする必要があるかによって異なりますが、多くの言語で「地図」と呼ばれているものが、探しているものになる可能性があります。C# はわかりませんが、このページによると、.NET 2.0 は map "ConvertAll" を呼び出します。

「マップ」の意味は非常に単純です。リストを取得し、その各要素に関数を適用して、新しいリストを返します。別のリストの述語を満たすアイテムのリストを提供する「フィルター」を探している場合もあります。

于 2008-08-16T22:37:06.690 に答える