2009-06-15 10 views
5

Una piccola domanda per principianti. Ho un ciclo foreach in cui sto cercando di accedere alla proprietà di un oggetto riga e assegnarlo a una stringa.ForEach Concat

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

} 

ad ogni iterazione ho bisogno di concat proprietà il nome di ogni riga al NomeFinale

\ Grazie mille,

+0

Che lingua è? –

+1

Per che lingua è questo? Sembra C#, ma potrebbe facilmente essere qualcos'altro. È necessario aggiungere un qualche tipo di delimitatore tra i nomi delle righe o willitbeareallylongnameinthefinale risultato? –

+0

@ Dillie-O modo eccellente di mostrare perché un delimitatore potrebbe essere una buona idea, +1 – kastermester

risposta

22

A seconda dei requisiti di prestazioni è possibile concat utilizzando l'operatore di addizione:

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

o utilizzare un StringBuilder:

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

string finalName = sb.ToString(); 

Generale per numeri molto piccoli di accodamenti non si noterà una differenza tra le due versioni. Ma se si stanno combinando molte stringhe, ci possono essere delle prestazioni notevoli e dei benefici della memoria nell'uso di StringBuilder.

Inoltre, tenere presente che questo posizionerà le stringhe direttamente una dopo l'altra in modo da poter anche aggiungere uno spazio o una nuova riga tra ciascuna di esse.


bonus speciale LINQ one-liner:

Dal momento che ti sembra di essere di nuovo da C# Io suggerirei che si ignora questo dato che è abbastanza avanzato e francamente non come leggibile (ma dall'altra mano a chi non piace lanciare pezzi casuali di LINQ nel loro codice?). Comunque, lo aggiungerò qui per completezza. Non so come sia la performance, ma uno dei principali vantaggi rispetto agli altri metodi è la facilità con cui puoi posizionare uno spazio o un altro personaggio tra le stringhe. Basta cambiare il valore nella linea marcata a qualsiasi valore che si desidera separare le stringhe combinate con (Environment.NewLine o "", per esempio)

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

o, se si preferisce lambda a LINQ:

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

Sono abbastanza sicuro che non vuoi "finalName" dichiarato all'interno del foreach. –

+0

Hai ragione. Fisso. –

+0

@Chris: sta concatenando i dati su ROWS, non COLUMNS. Migliaia di record in una tabella sono all'ordine del giorno. –

1

Se davvero si vuole solo concat, allora questo è tutto ciò che serve ...

string finalName = ""; 

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

} 
1

Ecco uno ...

string finalName = "" 

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

Ecco un altro ...

StringBuilder finalName = new StringBuilder() 

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

Solo un paio di cose ...

  1. DataSet 's non hanno le righe, hanno DataTable s, e quelli DataTable s avere DataRows
  2. È possibile utilizzare l'operatore += per eseguire una concatenazione, anche se il consiglio generale è che un oggetto StringBuilder è più adatto a questo r ragioni di prestazioni e memoria.

Assumendo che il DataSet ha uno DataTable e la colonna che stai dopo è chiamato name, è possibile utilizzare uno di questi (il primo utilizzando l'operatore +=, la seconda con un StringBuilder)

string finalName = string.Empty; 

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

oppure

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();