20

次のクエリがあります。

drivers.Select(d => { d.id = 0; d.updated = DateTime.Now; return d; }).ToList();

drivers は、さまざまな ID と更新された値を含む List であるため、Select の値を変更していますが、これが適切な方法です。Resharper が不平を言っているので、ドライバーをドライバーに再割り当てしていないことは既に知っています。

drivers = drivers.Select(d => { d.id = 0; d.updated = DateTime.Now; return d; }).ToList();

しかし、これはまだ誰かがドライバーリストの各要素に新しい値を割り当てる方法ですか?

4

3 に答える 3

37

これは無害に見えますが、特にコードをすぐに実行する呼び出しと組み合わせるとToList、クエリの一部として何かを変更することは避けたいと思います。特にこれまでに見たことがない場合。

foreachループに問題はありません。LINQ で実行できるからといって、それを実行する必要があるわけではありません。

于 2013-05-16T18:16:19.590 に答える
9

わかりました、私は自分で答えます。

Xaisoft、Linqクエリは、ラムダ式であろうとクエリ式であろうと、リストを変更するために使用すべきではありません。したがって、あなたのSelect

drivers = drivers.Select(d => { d.id = 0; d.updated = DateTime.Now; return d; }).ToList();

スタイルが悪い。混乱/読み取り不能であり、標準的ではなく、Linq哲学に反しています。最終結果を達成する別の貧弱なスタイルは次のとおりです。

drivers.Any(d => { d.id = 0; d.updated = DateTime.Now; return false; });

しかし、それが不適切だと言っForEachているわけではありません。List<T>あなたのような場合に使用されますが、ミューテーションとLinqクエリを混在させないでください。それだけです。私は次のようなものを書くことを好みます:

drivers.ForEach(d => d.updated = DateTime.Now);

そのエレガントでわかりやすい。を扱っていないのでLinq、混乱することもありません。ラムダ内の複数のステートメント(あなたの場合のように)の構文は好きではありません。物事が複雑になると、少し読みにくくなり、デバッグが難しくなります。あなたの場合、私はまっすぐなforeachループを好みます。

foreach (var d in drivers)
{ 
    d.id = 0; 
    d.updated = DateTime.Now; 
}

個人的には、式の終了呼び出しとしてForEachonが好きです (つまり、代入がクエリではなく実行を意図している場合)。IEnumerable<T> Linq

于 2013-05-16T18:50:00.780 に答える