Gibt es eine Möglichkeit, mit LINQ Folgendes zu tun?
foreach (var c in collection)
{
c.PropertyToSet = value;
}
Zur Verdeutlichung möchte ich jedes Objekt in einer Sammlung durchlaufen und dann eine Eigenschaft für jedes Objekt aktualisieren.
Mein Anwendungsfall ist, dass ich eine Reihe von Kommentaren zu einem Blog-Beitrag habe. Ich möchte jeden Kommentar in einem Blog-Beitrag durchlaufen und die Datums- und Uhrzeitangabe für den Blog-Beitrag auf +10 Stunden festlegen. Ich könnte es in SQL tun, aber ich möchte es in der Geschäftsschicht behalten.
Antworten:
Sie können zwar eine
ForEach
Erweiterungsmethode verwenden, aber wenn Sie nur das Framework verwenden möchten, können Sie dies tunDas
ToList
wird benötigt, um die Auswahl aufgrund der verzögerten Auswertung sofort auszuwerten .quelle
ObservableCollection
Mitspracherecht war, kann es hilfreich sein, Elemente an Ort und Stelle zu ändern, anstatt eine neue Liste zu erstellen.quelle
collection.ToList().ForEach(c => { c.Property1ToSet = value1; c.Property2ToSet = value2; });
collection.ToList().ForEach(c => { collection[collection.IndexOf(c)] = new <struct type>() { <propertyToSet> = value, <propertyToRetain> = c.Property2Retain }; });
Ich mache das
quelle
All()
Erweiterungsmethode und kann zu Verwirrung führen, wenn jemand anderes den Code liest.List<>
, ist dieForEach()
Methode eine viel weniger kryptische Methode, um dies zu erreichen. ExForEach(c => { c.needsChange = value; })
Ich habe tatsächlich eine Erweiterungsmethode gefunden, die das macht, was ich will
quelle
foreach
Schleife wirklich vermeiden möchten (aus welchem Grund auch immer).foreach
da der Code selbst dieforeach
Schleife enthältVerwenden:
Ich bin nicht sicher, ob dies LINQ überbeansprucht oder nicht, aber es hat bei mir funktioniert, wenn ich bestimmte Elemente in der Liste für eine bestimmte Bedingung aktualisieren möchte.
quelle
Hierfür gibt es keine integrierte Erweiterungsmethode. Obwohl die Definition eines ziemlich einfach ist. Am Ende des Beitrags befindet sich eine von mir definierte Methode namens Iterate. Es kann so verwendet werden
Quelle iterieren
quelle
Obwohl Sie speziell nach einer LINQ-Lösung gefragt haben und diese Frage ziemlich alt ist, poste ich eine Nicht-LINQ-Lösung. Dies liegt daran, dass LINQ (= sprachintegrierte Abfrage ) für Abfragen in Sammlungen verwendet werden soll. Alle LINQ-Methoden haben die zugrunde liegende Sammlung nicht ändern, sie einfach zurückgeben einen neuen (oder genauer gesagt einen Iterator auf eine neue Sammlung). Was auch immer Sie tun, z. B. mit a,
Select
wirkt sich nicht auf die zugrunde liegende Sammlung aus, Sie erhalten einfach eine neue.Natürlich könnten Sie es mit einem machen
ForEach
(was übrigens nicht LINQ ist, sondern eine Erweiterung aufList<T>
). Aber das buchstäblich verwendetforeach
sowieso, aber mit einem Lambda-Ausdruck. Abgesehen davon iteriert jede LINQ-Methode Ihre Sammlung intern, z. B. mithilfe vonforeach
oderfor
, verbirgt sie jedoch einfach vor dem Client. Ich halte dies nicht für lesbarer oder wartbarer (denken Sie daran, Ihren Code zu bearbeiten, während Sie eine Methode debuggen, die Lambda-Ausdrücke enthält).Allerdings sollte LINQ nicht zum Ändern von Elementen in Ihrer Sammlung verwendet werden. Ein besserer Weg ist die Lösung, die Sie bereits in Ihrer Frage angegeben haben. Mit einer klassischen Schleife können Sie Ihre Sammlung einfach iterieren und ihre Elemente aktualisieren. Tatsächlich sind all diese Lösungen, auf die man sich stützt,
List.ForEach
nichts anderes, aber aus meiner Sicht weitaus schwieriger zu lesen.Daher sollten Sie LINQ nicht in den Fällen verwenden, in denen Sie die Elemente Ihrer Sammlung aktualisieren möchten .
quelle
for
Schleife "unter der Haube" erstellen . Ich halte es für syntatischen Zucker, weniger ausführliche Methoden für einfache Aufgaben zu entwickeln und nicht die Standardcodierung zu ersetzen.Ich habe ein paar Variationen davon ausprobiert und gehe immer wieder auf die Lösung dieses Typen zurück.
http://www.hookedonlinq.com/UpdateOperator.ashx
Auch dies ist die Lösung eines anderen. Aber ich habe den Code in eine kleine Bibliothek kompiliert und verwende ihn ziemlich regelmäßig.
Ich werde seinen Code hier einfügen, damit seine Website (Blog) irgendwann nicht mehr existiert. (Es gibt nichts Schlimmeres als einen Beitrag mit den Worten "Hier ist die genaue Antwort, die Sie benötigen", "Klicken" und "Tote URL".)
quelle
Action<TSource>
anstatt einen zusätzlichen Delegaten zu erstellen. Dies war jedoch zum Zeitpunkt des Schreibens möglicherweise noch nicht verfügbar.where T: struct
diese beim Kompilieren abzufangen.Nein, LINQ unterstützt keine Art der Massenaktualisierung. Die einzige kürzere Möglichkeit wäre die Verwendung einer
ForEach
Erweiterungsmethode. Warum gibt es in IEnumerable keine ForEach-Erweiterungsmethode?quelle
Ich habe einige Erweiterungsmethoden geschrieben, um mir dabei zu helfen.
Ich benutze es so:
Als Referenz überprüfen Sie das Argument:
quelle
Meine 2 Pennies: -
quelle
Sie können LINQ verwenden, um Ihre Sammlung in ein Array zu konvertieren und dann Array.ForEach () aufzurufen:
Offensichtlich funktioniert dies nicht mit Sammlungen von Strukturen oder eingebauten Typen wie Ganzzahlen oder Zeichenfolgen.
quelle
Hier ist die Erweiterungsmethode, die ich verwende ...
quelle
List<T>.ForEach
auch tut, aber nur für alleIEnumerable
.Ich gehe davon aus, dass Sie Werte innerhalb einer Abfrage ändern möchten, damit Sie eine Funktion dafür schreiben können
Aber nicht sicher, ob du das meinst.
quelle
Sie können Magiq verwenden , ein Batch-Operations-Framework für LINQ.
quelle
Angenommen, wir haben Daten wie unten,
und wenn wir die Liste ändern und die vorhandenen Werte der Liste durch geänderte Werte ersetzen möchten, erstellen Sie zuerst eine neue leere Liste und durchlaufen dann die Datenliste, indem Sie die Änderungsmethode für jedes Listenelement aufrufen.
quelle