zoukankan      html  css  js  c++  java
  • DataTable To List<T> DataTable Linq学习笔记

    LINQ 查询适用于实现的数据源 IEnumerable<T>接口或System.Query.IQueryable接口。 

    DataTable类默认是没有实现以上接口的。

    所以要在DataTable中使用LINQ查询,需要调用一下AsEnumerable方法,返回一个EnumerableRowCollection<DataRow>集合。

    实例如下所示:

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Linq;
    using System.Windows.Forms;
    
    namespace DataTableToList
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private DataTable GetTable()
            {
                int[] id = { 4, 5, 1, 3, 2, 7, 6 };
                string[] name = { "Tom", "Jack", "Jime", "Lilei", "Jimo", "Koko", "Luoyi" };
                DataTable table = new DataTable("Student");
                table.Columns.Add("ID", typeof(int));
                table.Columns.Add("Name", typeof(string));
    
                for (int i = 0; i < id.Length; i++)
                {
                    table.Rows.Add(new object[] { id[i], name[i] });
                }
    
                return table;
            }
            //order by
            private void button1_Click(object sender, EventArgs e)
            {
                DataTable dt = GetTable();
                var students = dt.AsEnumerable();
    
                //排序
                var result = students.OrderBy(x => x.Field<int>("ID"));
                //输出
                this.listBox1.Items.Clear();
                foreach (DataRow row in result)
                {
                    this.listBox1.Items.Add("order by=="+row["ID"].ToString() + "==" + row["Name"].ToString());
                }
            }
            //where
            private void btnWhere_Click(object sender, EventArgs e)
            {
                DataTable dt = GetTable();
                var students = dt.AsEnumerable();
                //排序
                var result = students.Where(x => x.Field<int>("ID") > 3);
                //输出
                this.listBox1.Items.Clear();
                foreach (DataRow row in result)
                {
                    this.listBox1.Items.Add("where=="+row["ID"].ToString() + "==" + row["Name"].ToString());
                }
            }
    
            private void btnToList_Click(object sender, EventArgs e)
            {
                DataTable dt = GetTable();
                var students = dt.AsEnumerable();
                List<Student> list = students.Select
                    (
                       x => new Student
                        {
                            ID = x.Field<int>("ID"),
                            Name = x.Field<string>("Name")
                        }
                    ).ToList();
    
                this.listBox1.Items.Clear();
                foreach (Student item in list)
                {
                    this.listBox1.Items.Add("tolist=="+item.ID + "==" + item.Name);
                }
            }
    
        }
    
        public class Student
        {
            public int ID { get; set; }
            public string Name { get; set; }
        }
    }
    

    运行效果如下:

    方式二:

    /// <summary>
            /// DataTable转成List
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="dt"></param>
            /// <returns></returns>
            public static List<T> DataTableToList<T>(this DataTable dt)
            {
                var list = new List<T>();
                var plist = new List<PropertyInfo>(typeof(T).GetProperties());
                foreach (DataRow item in dt.Rows)
                {
                    T s = Activator.CreateInstance<T>();
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        PropertyInfo info = plist.Find(p => p.Name == dt.Columns[i].ColumnName);
                        if (info != null)
                        {
                            try
                            {
                                if (!Convert.IsDBNull(item[i]))
                                {
                                    object v = null;
                                    if (info.PropertyType.ToString().Contains("System.Nullable"))
                                        v = Convert.ChangeType(item[i], Nullable.GetUnderlyingType(info.PropertyType));
                                    else v = Convert.ChangeType(item[i], info.PropertyType);
                                    info.SetValue(s, v, null);
                                }
                            }
                            catch (Exception ex)
                            {
                                throw new Exception("字段[" + info.Name + "]转换出错," + ex.Message);
                            }
                        }
                    }
                    list.Add(s);
                }
                return list;
            }
    

      

  • 相关阅读:
    【Codeforces 923A】Primal Sport
    【Codeforces 924C】Riverside Curio
    【Codeforces 682C】Alyona and the Tree
    【Codeforces 1118D1】Coffee and Coursework (Easy version)
    【Codeforces 493C】Vasya and Basketball
    【Codeforces 598D】Igor In the Museum
    js 时间格式化
    C#自定义规则对比两个集合的对象是否相等
    VUE的组件DEMO
    js 去掉指定符号的字符串做法
  • 原文地址:https://www.cnblogs.com/YYkun/p/11319324.html
Copyright © 2011-2022 走看看