I have a datatable with few rows each row has few columns.
I want to create an arraylist that countain all row as a string
so each array item look like this {1
Here is a solution that actually works.
ArrayList rows = new ArrayList();
foreach (DataRow dataRow in myDataTable.Rows)
rows.Add(string.Join(";", dataRow.ItemArray.Select(item => item.ToString())));
However, I feel I should point out that it is unwise to use the obsolete ArrayList
. Use List<string>
instead, since the rows are strings:
List<string> rows = new List<string>();
The rest of the code is the same.
Here's my theory: This is a code fragment that I use to write a CSV for a datatable:
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');
}
}
Use StringBuffer instead of WriteItem ... stream etc...
Instead of using an ArrayList
I would recommend you using a strongly typed collection because an ArrayList
wouldn't bring much value compared to a non-strongly typed DataTable
. So you could start by defining a model that will represent each row:
public class MyModel
{
public int Id { get; set; }
public string Prop1 { get; set; }
public string Prop2 { get; set; }
}
then loop over your DataTable
and fill the collection:
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);
}
Or you could use LINQ if you prefer:
List<MyModel> models = dt.Rows
.Cast<DataRow>()
.Select(row => new MyModel {
Id = (int)row[0],
Prop1 = (string)row[1],
Prop2 = (string)row[2]
})
.ToList();
ArrayList rows = new ArrayList();
foreach (DataRow dataRow in ((DataTable)dataGrid.DataSource).Rows)
{
rows.Add(String.Join(";", (string[])dataRow.ItemArray));
}
ArrayList aList = new ArrayList(dt.Rows.Count);
foreach (DataRow row in dt.Rows)
{
aList.Add(row);
}