2010-08-26 31 views
7

Tengo una tabla de datos con pocas filas cada fila tiene pocas columnas.
que quieren crear un ArrayList que countain todo fila como una cadena
por lo que cada elemento de la matriz tener este aspecto {1;qwqww;qweqweqwe;qweqweqw;qwe}
Los elementos de la cadena serán separados ; y es una solución de 2 .NETC#, DataTable a ArrayList?

Gracias

+0

todas las columnas contener cadenas? – thelost

+0

sí (uno es booleano) pero se usará como "verdadero" "falso" –

+0

[¡No lo hagas!] (Http://stackoverflow.com/questions/434414/what-is-the-most-evil -code-you-have-seen-in-a-production-enterprise-environm/434562 # 434562) –

Respuesta

10

Aquí es una solución que realmente funciona.

ArrayList rows = new ArrayList(); 

foreach (DataRow dataRow in myDataTable.Rows) 
    rows.Add(string.Join(";", dataRow.ItemArray.Select(item => item.ToString()))); 

Sin embargo, creo que debo señalar que no es prudente utilizar la obsoleta ArrayList. List<string> utilizar en su lugar, ya que las filas son cadenas:

List<string> rows = new List<string>(); 

El resto del código es el mismo.

+1

Gracias, pero dataRow.ItemArray.Select (item => item.ToString) no funciona para mí. Estoy usando .NET v2 ¿hay algo que ver con eso? –

+0

Me sale "No se puede resolver el símbolo Seleccione" !!! –

+0

@ Base de datos: agregue 'using System.Linq;' en la parte superior del archivo. – Timwi

1

En lugar de usar un ArrayList, le recomendaría usar una colección fuertemente tipada porque un ArrayList no aportaría mucho valor en comparación con un DataTable sin tipeo fuerte. Por lo que podría empezar por definir un modelo que representará a cada fila:

public class MyModel 
{ 
    public int Id { get; set; } 
    public string Prop1 { get; set; } 
    public string Prop2 { get; set; } 
} 

continuación, un bucle sobre su DataTable y llenar la colección:

List<MyModel> models = new List<MyModel>(); 
foreach (DataRow row in dt.Rows) 
{ 
    MyModel model = new MyModel 
    { 
     Id = (int)row[0], 
     Prop1 = (string)row[1], 
     Prop2 = (string)row[2] 
    }; 
    models.Add(model); 
} 

O usted podría utilizar LINQ, si lo prefiere:

List<MyModel> models = dt.Rows 
    .Cast<DataRow>() 
    .Select(row => new MyModel { 
     Id = (int)row[0], 
     Prop1 = (string)row[1], 
     Prop2 = (string)row[2] 
    }) 
    .ToList(); 
+0

Agradable, pero ¿y si las filas en la tabla de datos variaran y no siempre fuera 3? – w69rdy

-2
ArrayList aList = new ArrayList(dt.Rows.Count); 
foreach (DataRow row in dt.Rows) 
{ 
    aList.Add(row); 
} 
+0

cómo se separarán los artículos en la cadena? ¿es por "," o ";"? –

+0

No funciona, quiere que cada elemento de la matriz sea una sola cadena, no un datarow – w69rdy

+0

oh ... ¡Me olvidé de ese hecho en su pregunta! –

1
ArrayList rows = new ArrayList(); 

foreach (DataRow dataRow in ((DataTable)dataGrid.DataSource).Rows) 
{ 
    rows.Add(String.Join(";", (string[])dataRow.ItemArray)); 
} 
+0

te refieres a ";" andnot "," en rows.Add (String.Join (",", (string []) dataRow.ItemArray)); ? –

+0

Sospecho que el lanzamiento a 'cadena []' generalmente fallará. – Timwi

+0

@ Base de Datos - sí, lo solucionó, gracias! @Timwi - Le pregunté cuál sería el tipo de elemento de matriz, parece que solo espera la cadena – thelost

0

Aquí es mi teoría: Este es un fragmento de código que utilizo para escribir un archivo CSV para una tabla de datos:

foreach (DataRow row in table.Rows) 
{ 
    for (int i = 0; i < table.Columns.Count; i++) 
    { 
     WriteItem(stream, row[i], quoteall); 
     if (i < table.Columns.Count - 1) 
      stream.Write(','); 
     else 
      stream.Write('\n'); 
    } 
} 

Uso StringBuffer en lugar de transmitir WriteItem ... etc ...

+0

Gracias por arreglar eso, voy a averiguar cómo poner el código correctamente – MikeAinOz