6

私はLINQをよく理解していないと思います。私はやってみたいです:

foreach (MyObjetc myObject in myObjectCollection)
{
    myObjet.MyProperty = newValue
}

コレクションのすべての要素のプロパティのすべての値を変更するだけです。

LINQ を使用すると、このようになりませんか?

myObjectCollection.Select(myObject => myObject.MyProperty = newValue)

うまくいきません。プロパティ値は変更されません。なんで?

編集:

ごめんなさい、皆さん。確かに、foreach は正しい方法です。しかし、私の場合、多くのコレクションで foreach を繰り返さなければならず、ループを繰り返したくありませんでした。それで、最後に、「Select」に似た「中間」ソリューション、「foreach」メソッドを見つけました。

myObjectCollection.ForEach(myObject => myObject.MyProperty = newValue)

とにかく、より単純なものほど明確ではないかもしれません:

foreach (MyObjetc myObject in myObjectCollection) myObjet.MyProperty = newValue;
4

2 に答える 2

8

まず、これは得策ではありません。それに対する反論については、以下を参照してください。

うまくいきません。プロパティ値は変更されません。なんで?

Select()結果を列挙するまで実際にはコレクションを反復処理せず、値に評価される式が必要なため、機能しません。

式が値を返すようにし、 などのクエリを完全に評価するものをToList()最後に追加すると、「機能」します。つまり、次のようになります。

myObjectCollection.Select(myObject => { myObject.MyProperty = newValue; return myObject;}).ToList();

そうは言っToList()ても、いくつかの欠点があります-主に、必要のない多くの余分な作業( を作成するList<T>)を行っているため、大きなコストがかかります。それを回避するには、コレクションを列挙する必要があります。

foreach(var obj in myObjectCollection.Select(myObject => { myObject.MyProperty = newValue; return myObject; })) 
{ }

繰り返しますが、これはお勧めしません。この時点で、Selectオプションははるかに醜い、より多くのタイピングなどです。これは、LINQ に関連する期待に違反しています。LINQ はクエリに関するものであり、LINQ を使用するときに副作用があってはならないことを示唆しています。副作用を作成します。

しかし、この時点では、「明確な」方法で (タイピングを減らして) 実行したほうがよいでしょう。

foreach (var obj in myObjectCollection)
{
     obj.MyProperty = newValue;
}

これはより短く、その意図が非常に明確で、非常にクリーンです。

各オブジェクトに対してアクションを実行する拡張メソッドを追加できることに注意してください。ただし、それForEach<T>は避けることをお勧めします。Eric Lippert は、読む価値のある主題について素晴らしいブログ投稿を書きました: "foreach" vs "ForEach" .

于 2013-11-14T00:19:58.073 に答える
0

sircodesalot が述べたように、linq を使用してそのようなことを行うことはできません。linq はクエリ言語であることを忘れないでください。つまり、実行できるのはクエリを実行することだけです。変更を行うには、他のロジックで行う必要があります。

最初の方法でやりたくない場合、およびコレクションが既にリストである場合 (しかし IEnumerable ではない場合)、linq で ForEach 拡張メソッドを使用して、求めていることを実行できます。

もう 1 つ言及する必要があるのは、Select メソッドが特定の情報を射影​​して IEnumerable に返すことです。したがって、コレクションから特定のプロパティのみを取得したい場合は、それを使用します。それだけです。

于 2013-11-14T00:20:25.513 に答える