2013-08-23 16 views
6

リストオブジェクトの複数の値を設定するには、次のようにしていますが失敗します。ラムダ式を使ってリストに複数の値を設定する方法は?

objFreecusatomization 
.AllCustomizationButtonList 
.Where(p => p.CategoryID == btnObj.CategoryID && p.IsSelected == true && p.ID == btnObj.ID) 
.ToList() 
.ForEach(x => x.BtnColor = Color.Red.ToString(), ); 

最後にコンマの後に別の値を設定します。 私は関連性のあるレコードが1つだけですが、何を表現する必要があります。

+2

LINQを悪用してコレクションを変更しないでください。これはクエリツールです。あなたのアプローチは 'foreach'よりも読みやすいものではありませんが、それははるかに効率が悪いです。 –

+0

それはうまくいくラムダ式でなければなりませんか?または他の方法、または私はオブジェクトを取った後にそれをループする必要があります。 – NoviceToDotNet

答えて

12

まあ、個人的に私はとにかく道コードを記述しないだろう - しかし、あなただけのstatement lambdaを使用することができます。

ステートメントラムダ文(複数可)で囲まれていることを除いて表現ラムダに似ています中括弧

ステートメントラムダの本体は、任意の数のステートメントで構成できます。実際には、典型的には2つまたは3つしかない。

のでForEach呼び出しは次のようになります。

.ForEach(x => { 
    x.BtnColor = Color.Red.ToString(); 
    x.OtherColor = Color.Blue.ToString(); 
}); 

を私はかかわらず、代わりにforeachループを記述します。

var itemsToChange = objFreecusatomization.AllCustomizationButtonList 
    .Where(p => p.CategoryID == btnObj.CategoryID 
       && p.IsSelected 
       && p.ID == btnObj.ID); 

foreach (var item in itemsToChange) 
{ 
    item.BtnColor = Color.Red.ToString(); 
    item.OtherColor = Color.Blue.ToString(); 
} 

を(あなたはforeach文自体にクエリーをインライン化することができ、個人的に私は別のローカル変数を使って上記のアプローチを見つけました。)

+0

しかし、私はリストが1つのレコードを保持していると確信しているので、私はそれをforeachでループする必要があります。 – NoviceToDotNet

+1

@NoviceToDotNet:もしそれが1つのレコードしか持たないなら、リストを作成するのではなく、 'FirstOrDefault'、' First'、 'SingleOrDefault'、または' Single'(どちらかもっとも適用可能なもの) 。 –

+2

@NoviceToDotNet:これは最初にマッチするものが1つだけ挙げられます。それをどうやって知っていたのですか?元のコードはループしていたので( 'ForEach'で)、私は自然にあなたが*必要とするループを想定していました。 –

関連する問題