首页 / C# / 正文

C#用Linq实现DataTable转换成List的方法实例详解

37366 发布于: 2014-08-19 读完约需9分钟

前段时间用反射的方法实现了DataTable转换成List的方法(见:C# DataTable转换成List的方法与测试)。

今天用Linq来实现DataTableList<Object>的转换,以前用DataTable转换成List都是forfor去的,当用了linq实现后,发现这种转换比for快捷多啦。

下面我还是以一个实例来作详细的实现和说明。首先,我们创建一个User类:

 public class User
  {
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public int Age { get; set; }
  }

然后就是主程序的各种代码实现:

class Program
  {
    static void Main(string[] args)
    {
      Console.WriteLine("Start...");
      Console.WriteLine("Add data to datatable...");
      var dt = InitDt();
      var list = ConvertDataTableToObjectList(dt);
      list.ForEach(x =>
      {
        Console.WriteLine("Element==>>Id:{0},Name:{1},Email:{2},Age:{3}", x.Id, x.Name, x.Email, x.Age);
      });
      Console.WriteLine("The end,press any key to exit...");
      Console.ReadKey();
    }

    static List<User> ConvertDataTableToObjectList(DataTable dt)
    {
      var list = (from t in dt.AsEnumerable()
                  select (new User
                  {
                    /*注意:t.Field<int>("Id")中的int表示DataTable中的数据类型,Id表示对应的列
                     * t.Field<int>("Id")表示把DataTable中的列名为Id的列对应的值赋给User的Id属性,
                     * 如果你不确定Field的数据类型,你可以用断点来查看
                    */
                    Id = t.Field<int>("Id"),
                    Name = t.Field<string>("Name"),
                    Email = t.Field<string>("Email"),
                    Age = t.Field<int>("Age"),
                  })).ToList();
      return list;
    }

    static DataTable InitDt()
    {
      var dt = new DataTable();
      dt.Columns.Add("Id", typeof(Int32));
      dt.Columns.Add("Name", typeof(String));
      dt.Columns.Add("Email", typeof(String));
      dt.Columns.Add("Age", typeof(Int32));
      for (int i = 1; i <= 5; i++)
      {
        var dr = dt.NewRow();
        dr["Id"] = i;
        dr["Name"] = "Name " + i;
        dr["Email"] = "Eamil " + i;
        dr["Age"] = 20 + i;
        dt.Rows.Add(dr);
      }
      return dt;
    }
  }

下面我贴一下如何查看DataTable中某一列的数据类型的方法(不太好示截图,弄成几张,将就着看,呵呵):

convert-list-1

convert-list-2

convert-list-3

convert-list-4

convert-list-5

好啦,从DataTableList<Object>的转换就完成的,是不是比较快捷呢。当然,用Linq实现的好处肯定不止转换快捷这一点,你也可以结合Lambda表达式做如排序的操作,下面是把List<Object>随机排序:

static List<User> ConvertDataTableToObjectList(DataTable dt)
    {
      var list = (from t in dt.AsEnumerable()
                  select (new User
                  {
                    /*注意:t.Field<int>("Id")中的int表示DataTable中的数据类型,Id表示对应的列
                     * t.Field<int>("Id")表示把DataTable中的列名为Id的列对应的值赋给User的Id属性,
                     * 如果你不确定Field的数据类型,你可以用断点来查看
                    */
                    Id = t.Field<int>("Id"),
                    Name = t.Field<string>("Name"),
                    Email = t.Field<string>("Email"),
                    Age = t.Field<int>("Age"),
                  })).OrderBy(x => Guid.NewGuid().ToString()).ToList();
      return list;
    }

好了,更多的实现你可以自行研究,我在这就不一一列举了。

如果你觉得对你有用,请点个赞,你的肯定是我继续写博文的最大动力,谢谢。如有问题,欢迎交流。附:本实例源码

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: 微软发布ASP.NET vNext in Visual Studio "14" CTP 3更新摘要

下一篇: 分享一个用C#(.NET)实现的多功能线程池管理组件--Smart Thread Pool

本文永久链接码友网 » C#用Linq实现DataTable转换成List的方法实例详解

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册