将Datatable的内容提取到列表C#中

时间:2014-01-10 13:35:49

标签: c# datatable

我正在尝试将数据表内容放入列表中。我使用以下代码,但它无法正常工作。

public List<object> ShowMessage()
    {
        List<object> obj = new List<object>();

        DataTable dt = new DataTable();
        dt.Columns.Add("ID");
        dt.Columns.Add("Name");

        dt.Rows.Add("1","AAA");
        dt.Rows.Add("2", "BBB");
        dt.Rows.Add("3", "CCC");

        foreach (DataRow dr in dt.Rows)
        {

            obj.Add(dr);
        }

        return obj;
    }

我是新手,不确定我是以正确的方式做的还是我需要使用其他东西。任何建议将受到高度赞赏。

感谢。

3 个答案:

答案 0 :(得分:2)

将您的DataTable转换为名称字符串列表(在Linq to DataSet的帮助下):

List<string> names = 
    dt.AsEnumerable().Select(r => r.Field<string>("Name")).ToList();

相同
List<string> names = new List<string>();

foreach(DataRow r in dt.Rows)    
    names.Add((string)r["Name"]);

答案 1 :(得分:1)

我认为你是一个太抽象的例子。这个使用一个名为Person

的可能类
public class Person
{
   public int PersonID;
   public string Name;
   // other fields will follow in future
}

public List<Person> GetPersonList()
{
   List<Person> people = new List<Person>();

   // This is just as example, because in real code 
   // you get this table from a database
   DataTable dt = new DataTable();
   dt.Columns.Add("ID");
   dt.Columns.Add("Name");

   dt.Rows.Add(1,"John");
   dt.Rows.Add(2, "Mark");
   dt.Rows.Add(3, "Steve");

   // Loop over the rows and construct a Person instance for every row
   // Add that row to the List<Person> to return 
   foreach (DataRow dr in dt.Rows)
   {
       Person p = new Person() {PersonID =Convert.ToInt32(dr[0]), Name = dr[1].ToString());
       people.Add(p);
   }
   return people;
}

顺便说一句,这种代码模式正是ORM为您做的好事。对Entity Framework或Dapper的一点研究将非常有用

答案 2 :(得分:0)

@Karni:你接近你所需要的。但下面是代码示例的修改版本,以便您实现所需的...

public class Obj
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class ListObj : List<Obj>
{

}


class Program
{
    static void Main(string[] args)
    {


        DataTable dt = new DataTable();
        dt.Columns.Add("ID");
        dt.Columns.Add("Name");

        dt.Rows.Add("1", "AAA");
        dt.Rows.Add("2", "BBB");
        dt.Rows.Add("3", "CCC");

        ListObj objListObj = new ListObj();

        //to fill the list / collection
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            objListObj.Add(new Obj() { ID = Convert.ToInt16(dt.Rows[i][0]), Name = dt.Rows[i][1].ToString() });
        }


        //To verify if the collection is filled.
        foreach (var item in objListObj)
        {
            Console.WriteLine(item.ID + " : " + item.Name);
        }

        Console.Read();
    }
}