2009-06-15 19 views
5

Eine kleine neue Frage. Ich habe eine foreach Schleife, in der ich versuche, auf die Eigenschaft eines Reihe Gegenstandes zuzugreifen und einer Schnur zuzuweisen.ForEach String concat

foreach(row in Dataset) 
{ 
string finalName= row.name; 

} 

Bei jeder Iteration Ich brauche jede Zeile Name-Eigenschaft auf den finalName verketten

\ Thanks a lot,

+0

Welche Sprache ist das? –

+1

Für welche Sprache ist das? Es erscheint C#, aber es könnte leicht etwas anderes sein. Müssen Sie zwischen den Zeilennamen eine Art Trennzeichen einfügen, oder wird im Endergebnis ein ganzer Name angegeben? –

+0

@ Dillie-O hervorragende Möglichkeit zu zeigen, warum ein Trennzeichen eine gute Idee sein könnte, +1 – kastermester

Antwort

22

Je nach Leistungsanforderungen können Sie entweder concat den Zusatz-Operator:

string finalName = string.Empty; 
foreach(row in Dataset) 
{ 
    finalName += row.name;  
} 

oder verwenden Sie eine StringBuilder:

Stringbuilder sb = new StringBuilder(); 
foreach(row in Dataset) 
{ 
    sb.Append(row.Name); 
} 

string finalName = sb.ToString(); 

Allgemein für sehr kleine Anhängigkeiten werden Sie keinen Unterschied zwischen den beiden Versionen bemerken. Wenn Sie jedoch viele Zeichenfolgen kombinieren, kann sich die Verwendung des StringBuilders sehr bemerkbar machen.

Denken Sie auch daran, dass dies die Strings direkt nacheinander platziert, so dass Sie auch ein Leerzeichen oder eine neue Zeile zwischen ihnen einfügen können.


Sonder Bonus LINQ Einzeiler:

Da Sie zu C# neu zu sein scheinen, würde ich, dass du dieses ignorieren vorschlagen, da es schon recht weit fortgeschritten ist und ehrlich gesagt nicht so lesbar (aber auf der anderen Hand, die nicht gerne zufällige Bits von LINQ in ihren Code werfen?). Trotzdem füge ich es hier zur Vollständigkeit hinzu. Ich weiß nicht, wie die Leistung ist, aber ein großer Vorteil gegenüber den anderen Methoden ist die Leichtigkeit, mit der Sie einen Platz oder ein anderes Zeichen zwischen den Strings platzieren können. Ändern Sie einfach den Wert in der markierten Linie auf den Wert, um die kombinierten Strings trennen wollen, mit (Environment.NewLine oder „“, zum Beispiel)

string finalName = string.Join(
       "", //Change the value here to separate the strings. 
       (from row in Dataset 
       select row.Name).ToArray()); 

oder, wenn Sie lambdas zu LINQ bevorzugen:

string finalName = string.Join(
      "", //Change the value here to separate the strings. 
      Dataset.Select(row => row.Name).ToArray()); 
+0

Ich bin mir ziemlich sicher, dass Sie nicht wollen, dass "finalName" innerhalb der Foreach deklariert. –

+0

Sie haben Recht. Fest. –

+0

@Chris: Er verkettet Daten über ROWS, nicht COLUMNS. Tausende von Datensätzen in einer Tabelle sind an der Tagesordnung. –

1

Wenn Sie wirklich nur verketten wollen, dann ist dies alles, was Sie brauchen ...

string finalName = ""; 

foreach(DataRow row in dataset.Tables[tablename].Rows) 
{ 
finalName += row.name; 

} 
1

Hier ist eine ...

string finalName = "" 

foreach (DataRow row in dataSet.TableX) 
{ 
    finalName += row.Name; 
    finalName += Environment.NewLine; 
} 

Hier ist eine andere ...

StringBuilder finalName = new StringBuilder() 

foreach (DataRow row in dataSet.TableX) 
{ 
    finalName.Append(row.Name); 
    finalName.Append(Environment.NewLine); 
} 
3

Nur ein paar Dinge ...

  1. DataSet ‚s haben keine Zeilen, sie haben DataTable s, und diese DataTable s haben DataRows
  2. Sie können den Operator += verwenden, um eine Verkettung durchzuführen, obwohl der allgemeine Hinweis ist, dass ein StringBuilder Objekt besser dafür geeignet ist r Leistung und Speicher Gründe.

Angenommen, Ihre DataSet hat eine DataTable und die Spalte Sie nach name genannt wird, können Sie entweder von diesen verwenden (die erste der +=-Operator, der zweite mit einem StringBuilder)

string finalName = string.Empty; 

foreach(DataRow row in dataSet.Tables[0].Rows) 
{ 
    finalName += row["name"].ToString(); 
} 

oder

System.Text.StringBuilder builder = new System.Text.StringBuilder(); 

foreach(DataRow row in dataSet.Tables[0].Rows) 
{ 
    builder.Append(row["name"].ToString()); 
} 

string finalName = builder.ToString();