2009-11-10 12 views
7

Ich habe ein String-Array, das ich über LINQ zu einem String Builder hinzufügen möchte.LINQ zum Anhängen an einen StringBuilder aus einem String []

Was ich im Grunde versuche zu sagen ist "Für jedes Element in diesem Array, eine Zeile an diesen StringBuilder anhängen".

Ich kann dies ganz einfach mit einer foreach-Schleife tun, aber der folgende Code scheint nichts zu tun. Was vermisse ich?

stringArray.Select(x => stringBuilder.AppendLine(x)); 

Wo, wie dies funktioniert:

foreach(String item in stringArray) 
{ 
    stringBuilder.AppendLine(item); 
} 
+0

Ich würde nicht den Befehl .Select verwenden ... ist nicht der Befehl ForEach verfügbar? – sebagomez

+0

Ich habe StringBuilder und StringArray umbenannt, um ein kleingeschriebenes erstes Zeichen zu verwenden. Nur um klarzustellen, dass ich auf Instanzvariablen und nicht auf Typen verweise. –

+0

ja es ist ... http://msdn.microsoft.com/en-us/library/zecdkyw2.aspx :) – sebagomez

Antwort

18

Wenn Sie darauf bestehen, es in einem LINQy Art und Weise tun:

StringBuilder builder = StringArray.Aggregate(
          new StringBuilder(), 
          (sb, s) => sb.AppendLine(s) 
         ); 

Alternativ kann, wie Luke auf eine andere Stelle in einem Kommentar darauf hingewiesen, könnte man sagen

Array.ForEach(StringArray, s => stringBuilder.AppendLine(s)); 

Der Grund, dass Select tut funktioniert nicht, weil Select zum Projizieren und Erstellen einer IEnumerable der Projektion ist. So ist die Codezeile

StringArray.Select(s => stringBuilder.AppendLine(s)) 

nicht iterieren nicht über die StringArray Aufruf stringBuilder.AppendLine(s) bei jeder Iteration. Stattdessen wird ein IEnumerable<StringBuilder> erstellt, der überzählig sein kann.

Ich nehme an, dass Sie

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

sagen könnte, aber das ist wirklich scheußlich.

+0

Danke Jason. Ihre Antwort erklärt, warum die Select-Methode nicht das gewünschte Ergebnis erzielt hat und warum die Foreach funktioniert hat. Ich bleibe bei der Foreach. Ich war wirklich nur neugierig auf das, was ich vermisste. Jetzt weiß ich. –

+0

Ist Last() garantiert zu iterieren? Anstatt nur StringArray [stringArray.count-1] abzurufen? Ich denke, ich hätte ToList() vorgezogen; – Taemyr

0

StringArray.DoForAll (x => StringBuilder.AppendLine (x));

+0

Was ist 'DoForAll'? – jason

+0

Entschuldigung, ich habe diese Erweiterungsmethode schon so lange, dass ich vergessen habe, dass sie nicht Teil des Frameworks ist. \t public static Klasse CommonExtensions \t { \t \t public static void DoForAll (diese IEnumerable Artikel, Aktion Aktion) \t \t \t where T: Klasse \t \t { \t \t \t if (Aktion == null) \t \t \t \t werfen neue ArgumentNullException ("action"); \t \t \t foreach (var Artikel in Artikel) \t \t \t \t Aktion (item); \t \t \t \t} } – vladhorby

+0

@vladhorby: Ein Blick auf, warum 'DoForAll' und andere gleichwertige Erweiterungen sind nicht implementiert: http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs -foreach.aspx – jason

6

Verwenden Sie die Erweiterungsmethode "ForEach" anstelle von "Select".

stringArray.ForEach(x => stringBuilder.AppendLine(x)); 
Verwandte Themen