Bedingte operator im lambda-Ausdruck in der ForEach() auf eine generische Liste?
Ist es nicht erlaubt, eine bedingte operator in einem lambda-Ausdruck in der ForEach?
List<string> items = new List<string>{"Item 1", "Item 2", "Item I Care About"};
string whatICareAbout = "";
//doesn't compile :(
items.ForEach(item => item.Contains("I Care About") ?
whatICareAbout += item + "," : whatICareAbout += "");
Kompilierungs-Fehler -> "Nur Belegung, call -, increment -, decrement, und neue Objekt-Ausdrücke können verwendet werden, wie eine Aussage"
Versucht, einen normalen, wenn nicht entweder Arbeit:
//:(
items.ForEach(item => if (item.Contains("I Care About")) {whatICareAbout += item + ", ";}
Einfach nicht möglich?
- Sheesh ich bin außerordentlich beeindruckt von den Antworten, die alle innerhalb von Minuten zu Fragen 🙂 ich denke, @SLaks Antworten die Absicht meiner Frage, aber Summe() blows my mind! 🙂 Nochmal danke an alle 🙂
- Sie hatte einen string-Ausdruck, der als eine Art bedingte operator, und Sie brauchte eine Erklärung für Ihr .ForEach () - Methode. Das ist, warum Kompilierungs-Fehler war da.
- Ich bekomme es jetzt! Ich denke, der eine ? x: y als kurzer hand für, wenn (a) {x} else {y} aber ? gibt den Wert von x und y, welche aus einem string, in diesem Fall...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ob Sie die kürzere form der lambda-Ausdrücke, die nur eine einzelne Ausdrücke.
Sie müssen die lange form, die es erlaubt, mehrere Anweisungen.
Beispiel:
Was versuchen Sie zu erreichen? Sind Sie versuchen, um zu bilden ein string mit Komma-separierten Elemente, in denen Sie enthalten einen bestimmten Wert? In linq würden Sie erreichen diese mit den folgenden:
Die Ausgabe von diesem ist "Artikel, den ich Über Pflege, Artikel, den ich Über Pflege, Element I Care About".
Hinweis: das Aggregat ist eine großartige Möglichkeit, um sicherzustellen, es ist keine nachgestellte ","
Aggregate
für sting concat ist eine sehr nette Idee, die ich noch nicht gedacht. Könnte man leicht ändern, Sie verwenden einStringBuilder
weilStringBuilder
hat ein fluent interface.Das problem war, dass die expression
ist keine Aussage. Es gibt einfach zurück, ein Wert, der Typ hat
string
.Gibt es einen trick, damit es funktioniert (nur zum Spaß):
Added mich einfach anrufen, um
.GetType()
Methode zum erstellen einer Anweisung aus dem ersten Ausdruck, und es kompiliert..ForEach()
Sie benötigt eine Erklärung 🙂Versuchen Klammern:
+= hat eine höhere Priorität als ?, das mag sein, warum Sie immer die Fehler. Mit Klammern, kann der Fehler Weg. Nicht 100% sicher, aber... die lambda-Ausdrücke können mit zusätzlichen Einschränkungen, die verhindern, dass die Verwendung von Zuweisungsanweisungen.
UPDATE:
Anstelle von mehreren += Aussagen, es ' s viel Reiniger, um den bedingten auf der rechten Seite der Zuweisung, wie diese:
UPDATE 2:
Aber noch besser ist es, nur verwenden, Aggregat (), da es entworfen ist, für genau dieses Szenario. Hier ist ein Beispiel:
Aber ich denke, @Matt Breckon ' s obige Antwort (, die ich gerade sah, als ich war über zu diesem post)ist sogar noch besser als mein Beispiel, da es befasst sich mit dem entfernen der Klemme ",". Blick auf seine Antwort... 🙂