【问题标题】:C#, DataTable to ArrayList?C#,DataTable 到 ArrayList?
【发布时间】:2010-08-26 09:07:34
【问题描述】:

我有一个包含几行的数据表,每行有几列。
我想创建一个将所有行计数为字符串的数组列表
所以每个数组项看起来像这样{1;qwqww;qweqweqwe;qweqweqw;qwe}
字符串中的项目将用; 分隔 它是一个 .NET 2 解决方案

谢谢

【问题讨论】:

  • 所有列都包含字符串?
  • 是(一个是布尔值),但它将被用作“真”“假”

标签: c# datatable arraylist


【解决方案1】:

这是一个真正有效的解决方案。

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

其余代码相同。

【讨论】:

  • 谢谢,但 dataRow.ItemArray.Select(item => item.ToString) 对我不起作用!我正在使用 .NET v2 有什么关系吗?
  • @Data-Base:在文件顶部添加using System.Linq;
【解决方案2】:

我建议您使用强类型集合,而不是使用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();

【讨论】:

  • 很好,但是如果数据表中的行不同并且并不总是 3 行怎么办?
【解决方案3】:
ArrayList rows = new ArrayList();

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

【讨论】:

  • 你的意思是“;”而不是 "," 在 rows.Add(String.Join(",", (string[])dataRow.ItemArray)); ?
  • 我怀疑对string[] 的转换通常会失败。
  • @Data-Base - 是的,已修复,谢谢! @Timwi - 我问数组项类型是什么,看起来他只需要字符串
【解决方案4】:

这是我的理论: 这是我用来为数据表编写 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 ...流等...

【讨论】:

  • 感谢您解决这个问题,我会找出如何正确放入代码
【解决方案5】:
ArrayList aList = new ArrayList(dt.Rows.Count);
foreach (DataRow row in dt.Rows)
{
    aList.Add(row);
}

【讨论】:

  • 如何在字符串中分隔项目?是用“,”还是“;”?
  • 不行,他希望每个数组项作为单个字符串,而不是数据行
  • 哦..我在他的问题中错过了这个事实!
猜你喜欢
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
  • 2017-02-20
  • 2011-02-05
  • 2017-01-30
  • 1970-01-01
相关资源
最近更新 更多