Werte in einem LINQ-Objekt zuweisen

Ich habe folgende Abfrage:

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

Treiber ist eine Liste, die mit verschiedenen IDs und aktualisierten Werten geliefert wird, also ändere ich die Werte in der Auswahl, aber es ist der richtige Weg, dies zu tun. Ich weiß bereits, dass ich Fahrern keine Fahrer neu zuweiße, weil Resharper sich darüber beschwert, also denke ich, es wäre besser, wenn es war:

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

Aber ist dies immer noch die Art, wie jemand jedem Element in der Treiberliste neue Werte zuweisen sollte?

Obwohl dies unschuldig erscheint, insbesondere in Kombination mit einem ToList Aufruf, der den Code sofort ausführt, würde ich mich definitiv davon ToList , irgendetwas als Teil einer Abfrage zu ToList : Der Trick ist so ungewöhnlich, dass er Leser Ihres Programms, selbst erfahrene, stolpern würde besonders, wenn sie das vorher nie gesehen haben.

Es ist nichts falsch mit foreach Schleifen – die Tatsache, dass Sie es mit LINQ tun können, bedeutet nicht, dass Sie es tun sollten .

Tue das NIEMALS. Eine Abfrage sollte eine Abfrage sein ; es sollte zerstörungsfrei Fragen einer Datenquelle stellen. Wenn Sie einen Nebeneffekt verursachen möchten, verwenden Sie eine foreach Schleife. Dafür ist es da. Verwenden Sie das richtige Werkzeug für den Job.

Ok, ich werde selbst eine Antwort geben.

Xaisoft, Linq Abfragen, sei es Lambda-Ausdruck oder Abfrageausdruck, sollten nicht verwendet werden, um die Liste zu mutieren. Daher Ihre Select

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

ist ein schlechter Stil. Es verwirrt / unlesbar, nicht Standard und gegen Linq Philosophie. Eine andere schlechte Art, das Endergebnis zu erreichen, ist:

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

Aber das heißt nicht, dass ForEach on List unangebracht ist. Es findet Anwendungen in Fällen wie dem Ihren, aber mischen Sie keine Mutation mit Linq Abfrage, das ist alles. Ich schreibe lieber etwas wie:

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

Es ist elegant und verständlich. Da es sich nicht um Linq , ist es auch nicht verwirrend. Ich mag diese Syntax nicht für mehrere statementen (wie in Ihrem Fall) innerhalb des Lambda. Es ist ein bisschen weniger lesbar und schwieriger zu debuggen, wenn die Dinge komplex werden. In meinem Fall bevorzuge ich eine direkte foreach Schleife.

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

Persönlich mag ich ForEach auf IEnumerable als einen terminierenden Aufruf an Linq Ausdruck (dh, wenn die Zuordnung nicht eine Abfrage, sondern eine Ausführung sein soll).