10
votes

Utilisation de l'opérateur conditionnel à Lambda Expression dans Foreach () sur une liste générique?

N'est-il pas autorisé à avoir un opérateur conditionnel dans une expression de Lambda dans pourcheach?

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


3 commentaires

Sheesh je suis exceptionnellement impressionné par les réponses, toutes quelques minutes de poser :) Je pense que @slaks répond à l'intention de ma question, mais que l'agrégat () souffle mon esprit! :) merci encore tout le monde :)


Vous avez eu une expression de chaîne en tant que type d'opérateur conditionnel et vous aviez besoin d'une déclaration de votre méthode .Foreseach (). C'est pourquoi une erreur de compilation était là.


@Roman - je l'obtiens maintenant! Je pense à un? x: y comme court main pour if (a) {x} else {y} mais? Renvoie la valeur de x et y, qui était une chaîne dans ce cas ...


4 Réponses :


32
votes

Vous utilisez la forme plus courte d'expressions Lambda, ce qui permet uniquement une seule expressions.
Vous devez avoir la forme longue, qui permet plusieurs déclarations.

Par exemple: P>

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


0 commentaires

1
votes

Essayez des parenthèses:

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


0 commentaires

5
votes

Qu'est-ce que vous essayez d'atteindre? Essayez-vous de former une chaîne d'articles séparés par des virgules dans lesquels ils contiennent une valeur particulière? Dans LINQ, vous obtiendrez cela en utilisant ce qui suit:

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


2 commentaires

En utilisant agrégat pour Sting Concat est une idée très soignée que je n'ai pas pensée. Vous pouvez facilement le changer pour utiliser un stringbuilder car stringbililater a une interface fluide.


HAH, j'ajoutais juste un échantillon de code agrégé () à ma réponse initiale ... mais j'aime mieux le vôtre. +1!



4
votes

Le problème était que l'expression xxx pré>

n'est pas une déclaration forte>. Il renvoie simplement une valeur qui a de type chaîne code>. P>

Il y a un tour pour le faire fonctionner (juste pour le plaisir): P>

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


1 commentaires

Et pour .foreseach () vous avez besoin d'une déclaration :)