【发布时间】:2010-08-26 09:07:34
【问题描述】:
我有一个包含几行的数据表,每行有几列。
我想创建一个将所有行计数为字符串的数组列表
所以每个数组项看起来像这样{1;qwqww;qweqweqwe;qweqweqw;qwe}
字符串中的项目将用; 分隔
它是一个 .NET 2 解决方案
谢谢
【问题讨论】:
-
所有列都包含字符串?
-
是(一个是布尔值),但它将被用作“真”“假”
我有一个包含几行的数据表,每行有几列。
我想创建一个将所有行计数为字符串的数组列表
所以每个数组项看起来像这样{1;qwqww;qweqweqwe;qweqweqw;qwe}
字符串中的项目将用; 分隔
它是一个 .NET 2 解决方案
谢谢
【问题讨论】:
这是一个真正有效的解决方案。
ArrayList rows = new ArrayList();
foreach (DataRow dataRow in myDataTable.Rows)
rows.Add(string.Join(";", dataRow.ItemArray.Select(item => item.ToString())));
但是,我觉得我应该指出,使用过时的ArrayList 是不明智的。请改用List<string>,因为行是字符串:
List<string> rows = new List<string>();
其余代码相同。
【讨论】:
using System.Linq;。
我建议您使用强类型集合,而不是使用ArrayList,因为与非强类型DataTable 相比,ArrayList 不会带来太多价值。所以你可以从定义一个代表每一行的模型开始:
public class MyModel
{
public int Id { get; set; }
public string Prop1 { get; set; }
public string Prop2 { get; set; }
}
然后遍历您的 DataTable 并填充集合:
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);
}
如果您愿意,也可以使用 LINQ:
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));
}
【讨论】:
string[] 的转换通常会失败。
这是我的理论: 这是我用来为数据表编写 CSV 的代码片段:
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');
}
}
使用 StringBuffer 代替 WriteItem ...流等...
【讨论】:
ArrayList aList = new ArrayList(dt.Rows.Count);
foreach (DataRow row in dt.Rows)
{
aList.Add(row);
}
【讨论】: