8
votes

LINQ à ajouter à un StringBuilder d'une chaîne []

J'ai une matrice de chaîne que je veux ajouter à un constructeur à cordes à titre de Linq.

Qu'est-ce que j'essaie essentiellement de dire est "pour chaque élément de cette matrice, appendez une ligne à Ce stringbuilder ".

Je peux le faire assez facilement en utilisant une boucle de foresach, mais le code suivant ne semble rien faire. Qu'est-ce que je manque? xxx

où cela fonctionne: xxx


3 commentaires

Je n'utiliserais pas la commande .Sélectionnez ... la commande de foresach n'est-elle pas disponible?


J'ai renommé StringBuilder et matrice de chaîne pour utiliser un premier caractère minuscule. Juste pour préciser que je parle de variables d'instance et pas de types.


Oui, c'est ... MSDN.MICROSSOFT.COM/EN-US/LIBRAY/ zecdkyw2.aspx :)


4 Réponses :


-1
votes
public static class CommonExtensions 
{ 
    public static void DoForAll<T>(this IEnumerable<T> items, Action<T> action) where T: class 
    { 
        if (action == null) 
            throw new ArgumentNullException("action"); 
        foreach (var item in items) 
            action(item);   
    }
} 

2 commentaires

Désolé, j'ai eu cette méthode d'extension depuis si longtemps, j'ai oublié ne fait pas partie du cadre. Public Static Class Commonextensions {Void public statique DOFORALL (cet iNumérable Articles, action Action) Où T: Classe {if (Action == null) jette une nouvelle argumentNullexception ("action"); action (Var Article dans les éléments) Action (article); }}


@vladhorby: une vue sur la raison pour laquelle DOFORALL et d'autres extensions équivalentes ne sont pas implémentés: blogs.msdn.com/ericlippert/archive/2009/05/18/...



20
votes

Si vous insistez pour le faire sous une manière Linqy:

var e = stringArray.Select(x => stringBuilder.AppendLine(x));
StringBuilder sb = e.Last();
Console.WriteLine(sb.ToString());


2 commentaires

Merci Jason. Votre réponse explique pourquoi la méthode de sélection n'a pas atteint le résultat que je voulais et pourquoi le Foraach travaillait. Je vais rester avec le forach. J'étais vraiment curieux de ce que j'avais manqué. Maintenant je sais.


Est la dernière () garantie d'itérer? Plutôt que de chercher Stringarray [stringarray.count-1]? Je pense que j'aurais préféré Tolist ();



4
votes

Utilisez la méthode d'extension "foreach" au lieu de "SELECT".

Array.ForEach(stringArray, x => stringBuilder.AppendLine(x));


1 commentaires

@Gernold mis à jour, en fonction de vos commentaires. Merci.



0
votes

Si vous utilisez .NET CORE, cela fonctionnera:

stringBuilder.AppendJoin(Environment.NewLine, stringArray);


2 commentaires

Vous devez inclure une clarification que cette méthode n'est disponible que dans .NET Core, au moins pour l'instant. Il devrait également être dans .NET 5 quand c'est officiellement libéré.


C'est l'une des choses que j'aime sur Internet. 11 ans et nous avons une nouvelle réponse! Incroyable.