2009-06-15 22 views
5

Una pequeña pregunta para novatos. Tengo un bucle foreach en el que intento acceder a la propiedad de un objeto de fila y asignarlo a una cadena.ForEach String concat

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

} 

En cada iteración necesito a concat propiedad del nombre de cada fila a la finalName

\ Muchas gracias,

+0

¿Qué idioma es este? –

+1

¿Para qué idioma es esto? Parece C#, pero fácilmente podría ser otra cosa. ¿Necesita agregar algún tipo de delimitador entre los nombres de las filas, o tendrá un nombre muy largo en el resultado final? –

+0

@ Dillie-O excelente manera de mostrar por qué un delimitador podría ser una buena idea, +1 – kastermester

Respuesta

22

Dependiendo de sus requisitos de rendimiento se puede ya sea concat utilizando el operador de suma:

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

o utilizar un StringBuilder:

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

string finalName = sb.ToString(); 

General para cantidades muy pequeñas de anexos, no notará una diferencia entre las dos versiones. Pero si combina muchas cadenas, puede haber un rendimiento muy notable y un beneficio de memoria al usar StringBuilder.

También tenga en cuenta que esto colocará las cuerdas directamente una después de la otra, por lo que también puede agregar un espacio o una nueva línea entre cada una de ellas.


bonificación especial LINQ de una sola línea:

Ya que parece ser nuevo para C# Me gustaría sugerir que ignore éste, ya que está bastante avanzada y francamente no tan legible (pero por otro ¿a quién no le gusta arrojar bits aleatorios de LINQ en su código?). Aún así, lo agregaré aquí para completarlo. No sé cómo es el rendimiento, pero una gran ventaja con respecto a los otros métodos es la facilidad con la que puede colocar un espacio u otro carácter entre las cadenas. Sólo cambia el valor en la línea marcada a cualquier valor que quiera separar las cadenas combinadas con (Environment.NewLine o "", por ejemplo)

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

o, si lo prefiere lambdas a LINQ:

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

Estoy bastante seguro de que no quiere declarar "nombre final" dentro del foreach. –

+0

Tienes razón. Fijo. –

+0

@Chris: está concatenando datos en ROWS, no en COLUMNS. Miles de registros en una tabla son comunes. –

1

Si realmente quieres a concat, entonces esto es todo lo que necesita ...

string finalName = ""; 

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

} 
1

Aquí hay uno ...

string finalName = "" 

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

Aquí hay otro ...

StringBuilder finalName = new StringBuilder() 

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

Sólo un par de cosas ...

  1. DataSet 's no tienen filas, tienen DataTable s, y esos DataTable s tienen DataRows
  2. Puede usar el operador += para realizar una concatenación, aunque el consejo general es que un objeto StringBuilder es más adecuado para este r razones de rendimiento y memoria.

Asumiendo que su DataSet tiene uno DataTable y la columna que está buscando se llama name, puede utilizar cualquiera de ellos (el primero se utiliza el operador +=, el segundo utilizando un StringBuilder)

string finalName = string.Empty; 

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

o

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