2009-11-29 7 views
7

ForEachのラムダ式で条件演算子を使用することはできませんか?ForEach()のラムダ式の条件付き演算子を汎用リストに使用しますか?

List<string> items = new List<string>{"Item 1", "Item 2", "Item I Care About"}; 

string whatICareAbout = ""; 

// doesn't compile :(
items.ForEach(item => item.Contains("I Care About") ? 
whatICareAbout += item + "," : whatICareAbout += ""); 

コンパイル・エラー - >「のみ割り当て、呼び出し、インクリメント、デクリメント、および新しいオブジェクト式がステートメントとして使用することができ、」

ノーマルを使用しようとすると動作しない場合は、次のいずれか

// :(
items.ForEach(item => if (item.Contains("I Care About")) {whatICareAbout += item + ", ";} 

ちょっとできませんか?

+2

Sheesh私は非常に答えに感心しています。私は@SLaksが私の質問の意図に答えると思いますが、Aggregate()は私の心を吹き飛ばします。 :) Thanks again everyone everyone: – Jamezor

+1

条件演算子の型として文字列式があり、.ForEach()メソッドの文が必要でした。コンパイルエラーがそこにあったのです。 –

+1

@Roman - 今すぐ入手!私は思いますか? x:yが(a){x} else {y}の短手であるが?この場合の文字列だったxとyの値を返します。 – Jamezor

答えて

26

ラムダ式の短い形式を使用していますが、これは1つの式のみを許可します。
複数のステートメントが可能な長い形式が必要です。例えば

items.ForEach(item => { 
    if (item.Contains("I Care About")) 
     whatICareAbout += item + ", "; 
}); 
1

括弧をお試しください:

items.ForEach(item => item.Contains("I Care About") ? (whatICareAbout += item + ",") : (whatICareAbout += "")); 

+ =は、より高い優先順位を持っている、あなたがエラーを取得している理由であってもよいこと?。かっこでは、エラーが消えることがあります。しかし、これは100%ではありません...ラムダ式には代入文の使用を禁止する追加の制限があるかもしれません。

UPDATE:

List<string> items = new List<string> { "one", "two", "three" }; 
string whatICareAbout = ""; 
items.ForEach(item => whatICareAbout += item.Contains("I Care About") ? (item + ",") : ""); 

はUPDATE 2:

代わりに、複数の+ =文の

、それはこのように、割り当ての右側に条件を置くために多くのクリーナーです

しかし、このシナリオに合わせて設計されているので、Aggregate()を使う方が良いです。ここでは一つのサンプルです:

string whatICareAbout = items.Aggregate("", (total, item) => item.Contains("I Care About") ? (total + item + ",") : total); 

は、しかし、私はそれは、端末の除去を扱うので、(私はこれを投稿しようとしたとして、私はちょうど見た)上記@Matt Breckon's答えは「」私の例よりも優れていると思います。彼の答えを見てください:-)

5

あなたは何を達成しようとしていますか?特定の値を含むコンマ区切りの文字列を作成しようとしていますか? LINQでは次を使用して、これを達成するであろう:

List<string> items = new List<string> { "Item 1", "Item 2", "Item I Care About", "Item I Care About", "Item I Care About" }; 
string whatICareAbout = items.Where(x => x.Contains("I Care About")) 
           .Aggregate((y, z) => y + ", " + z); 

これからの出力は「私が気項目、私が気項目、私が気項目」です。

注:集計は末尾がない確実にする素晴らしい方法である「」

+0

sting concatに 'Aggregate'を使用することは、私が考えていない非常にきちんとした考えです。 'StringBuilder'は流暢なインターフェースを持っているので、簡単に' StringBuilder'を使うように変更することができます。 – SLaks

+0

ええと、最初の答えにAggregate()コードサンプルを追加していただけですが、私はあなたのほうがよかったです。 +1! –

4

問題は表現

item.Contains("I Care About") ? whatICareAbout += item + "," : whatICareAbout += "" 

ではないということでした。これは、タイプがstringの値を返します。

ありが(ちょうど楽しみのために)それを動作させるためのトリックがある:

items.ForEach(item => (item.Contains("I Care About") ? 
    whatICareAbout += item + "," : whatICareAbout += "").GetType()); 

私は単純に、最初の式から文を作成するために、.GetType()メソッドの呼び出しを追加し、それをコンパイル。

+0

'.ForEach()'にはステートメントが必要でした:) –

関連する問題