Utilisation de l’opérateur conditionnel dans l’expression lambda dans ForEach () sur une liste générique?

Ne peut-on pas avoir d’opérateur conditionnel dans une expression lambda dans ForEach?

List items = new List{"Item 1", "Item 2", "Item I Care About"}; ssortingng whatICareAbout = ""; // doesn't comstack :( items.ForEach(item => item.Contains("I Care About") ? whatICareAbout += item + "," : whatICareAbout += ""); 

Erreur de compilation -> “Seules les expressions d’affectation, d’appel, d’incrémentation, de décrémentation et de nouvel object peuvent être utilisées comme instruction”

Essayer d’utiliser une normale si ne fonctionne pas non plus:

 // :( items.ForEach(item => if (item.Contains("I Care About")) {whatICareAbout += item + ", ";} 

Tout simplement pas possible?

Vous utilisez la forme plus courte des expressions lambda, qui n’autorise qu’une seule expression.
Vous avez besoin de la forme longue, qui permet plusieurs déclarations.

Par exemple:

 items.ForEach(item => { if (item.Contains("I Care About")) whatICareAbout += item + ", "; }); 

Qu’essayez-vous de réaliser? Essayez-vous de former une chaîne d’éléments séparés par des virgules contenant une valeur particulière? Dans linq, vous obtiendriez ceci en utilisant ce qui suit:

  List items = new List { "Item 1", "Item 2", "Item I Care About", "Item I Care About", "Item I Care About" }; ssortingng whatICareAbout = items.Where(x => x.Contains("I Care About")) .Aggregate( (y, z) => y + ", " + z); 

Le résultat de ceci est “Item I Care About, Item I Care About, Item I Care About”.

Remarque: L’agrégat est un excellent moyen de s’assurer qu’il n’y a pas de ”

Le problème était cette expression

 item.Contains("I Care About") ? whatICareAbout += item + "," : whatICareAbout += "" 

n’est pas une déclaration . Il renvoie simplement une valeur qui a le type ssortingng .

Il y a une astuce pour le faire fonctionner (juste pour le fun):

  items.ForEach(item => (item.Contains("I Care About") ? whatICareAbout += item + "," : whatICareAbout += "").GetType()); 

J’ai simplement ajouté un appel à la méthode .GetType() pour créer une instruction à partir de l’expression initiale, et celle-ci a été compilée.

Essayez les parenthèses:

 items.ForEach(item => item.Contains("I Care About") ? (whatICareAbout += item + ",") : (whatICareAbout += "") ); 

+ = a une priorité plus élevée que?, c’est peut-être pour cela que vous obtenez l’erreur. Avec des parenthèses, l’erreur peut disparaître. Pas sûr à 100%, cependant … Les expressions lambda peuvent comporter des ressortingctions supplémentaires qui empêchent l’utilisation d’instructions d’affectation.

METTRE À JOUR:

Au lieu de plusieurs instructions + =, il est beaucoup plus simple de placer les conditions à droite de la tâche, comme ceci:

 List items = new List { "one", "two", "three" }; ssortingng whatICareAbout = ""; items.ForEach(item => whatICareAbout += item.Contains("I Care About") ? (item + ",") : ""); 

MISE À JOUR 2:

Mais il est même préférable d’utiliser simplement Aggregate () car il est conçu exactement pour ce scénario. Voici un exemple:

 ssortingng whatICareAbout = items.Aggregate("", (total, item) => item.Contains("I Care About") ? (total + item + ",") : total); 

Mais je pense que la réponse de @Matt Breckon ci-dessus (que je viens de voir alors que je m’apprêtais à le poster) est encore meilleure que mon exemple puisqu’il traite de la suppression du terminal “,”. Regardez sa réponse … 🙂