Datatable C#使用中DataRow中的列名是不区分大小的

工作中看到一段需要动态转换模型的代码,当数据比较多的时候,效率会慢,经过试验C# 虽然区分大小写,但在Datarow中是模糊了的,遂意为C#还是很好用的。示例Demo如下,推荐第二种写法。
推荐写法:

        public static List DataTableToList2(DataTable dt)
        {
            List lists = new List();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                T t = Activator.CreateInstance();
                //获取当前T对象的所有属性
                PropertyInfo[] propertys = t.GetType().GetProperties();
                //通过属性集合迭代出每一个属性对象
                foreach (PropertyInfo item in propertys)
                {
                    int index = dt.Columns.IndexOf(item.Name);// datatable 中列名不区分大小写,
                    if (index>=0)//dt.Columns.Contains(item.Name),用index读取值速度要更好一些
                    {
                        //判断当前DataTable的单列值是否为null
                        if (dt.Rows[i][index] != DBNull.Value)
                            //将当前DataTable的单列值赋予相匹配的属性,否则赋予一个null值.
                            item.SetValue(t, (dt.Rows[i][index]), null);
                        else
                            item.SetValue(t, null, null);

                    }

                }
                lists.Add(t);
            }
            return lists;
        }

懒得分开写,直接写代码吧:


    public class TmpMode
    {
        public string AAA { get; set; }
        public string BBB { get; set; }
        public string c { get; set; }
        public string AAA1 { get; set; }
        public string BBB2 { get; set; }
        public string AAA3 { get; set; }
        public string BBB4 { get; set; }
        public string AAA5 { get; set; }
        public string BBB6 { get; set; }
        public string AAA7 { get; set; }
        public string BBB8 { get; set; }
        public string AAA9 { get; set; }
        public string BBB10 { get; set; }
        public string BBB11 { get; set; }
        public string AAA12 { get; set; }
        public string BBB12 { get; set; }
        public string AAA14 { get; set; }
        public string BBB15 { get; set; }
    }
    public class DataTableTest
    {
        List lstModes = new List();
        public void TestColumsNameIngore()
        {
            long first = 0, second = 0, three = 0;
            DataTable t = new DataTable("mytable");
            DataColumn col = new DataColumn("Aaa", System.Type.GetType("System.String"));
            t.Columns.Add(col);
            col = new DataColumn("Bbb", System.Type.GetType("System.String"));
            t.Columns.Add(col);
            col = new DataColumn("c", System.Type.GetType("System.String"));
            t.Columns.Add(col);
            col = new DataColumn("ddd", System.Type.GetType("System.String"));
            t.Columns.Add(col);
            for (int i = 0; i < 100; i++)
            {
                DataRow row = t.NewRow();
                row["Aaa"] = "aaa" + i;
                row["Bbb"] = "bbb" + i;
                row["c"] = "c" + i;
                t.Rows.Add(row);
            }
            StringBuilder str = new StringBuilder();
            Stopwatch watch = new Stopwatch();
            watch.Start();
            lstModes = DataTableToList(t);


            foreach (var s in lstModes)
            {
                str.AppendLine(s.AAA + "  " + s.BBB + "  " + s.c);
            }
            watch.Stop();
            Console.WriteLine("第一种转换:");
            Console.WriteLine(str.ToString());
            Console.WriteLine("用时:" + watch.ElapsedMilliseconds);
            first = watch.ElapsedMilliseconds;

            lstModes.Clear();
            Console.WriteLine("清空模型:"+lstModes.Count);
            watch.Reset();
            watch.Start();
            lstModes = DataTableToList2(t);
            str.Clear();
            foreach (var s in lstModes)
            {
                str.AppendLine(s.AAA + "  " + s.BBB + "  " + s.c);
            }
            watch.Stop();
            Console.WriteLine("第二种转换:");
            Console.WriteLine(str.ToString());
            Console.WriteLine("用时:" + watch.ElapsedMilliseconds);
            second = watch.ElapsedMilliseconds;

            lstModes.Clear();
            Console.WriteLine("清空模型:" + lstModes.Count);
            watch.Reset();
            watch.Start();
            lstModes = DataTableToList3(t);
            str.Clear();
            foreach (var s in lstModes)
            {
                str.AppendLine(s.AAA + "  " + s.BBB + "  " + s.c);
            }
            watch.Stop();
            Console.WriteLine("第三种转换:");
            Console.WriteLine(str.ToString());
            Console.WriteLine("用时:" + watch.ElapsedMilliseconds);
            three = watch.ElapsedMilliseconds;

            Console.WriteLine("对比:" + first +"   "+second+"  "+three);
            Console.ReadLine();
        }

        public static List DataTableToList(DataTable dt)
        {
            List lists = new List();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                T t = Activator.CreateInstance();
                //获取当前T对象的所有属性
                PropertyInfo[] propertys = t.GetType().GetProperties();
                //通过属性集合迭代出每一个属性对象
                foreach (PropertyInfo item in propertys)
                {
                    #region == 原来的获取 ==
                    //循环迭代出DataTable的每一列
                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        //判断当前迭代出的属性名称是否和迭代出的DataTable的列名称一致
                        if (item.Name.ToLower().Equals(dt.Columns[j].ColumnName.ToLower()))
                        {
                            //判断当前DataTable的单列值是否为null
                            if (dt.Rows[i][j] != DBNull.Value)
                                //将当前DataTable的单列值赋予相匹配的属性,否则赋予一个null值.
                                item.SetValue(t, (dt.Rows[i][j]), null);
                            else
                                item.SetValue(t, null, null);
                            break;
                        }

                    }
                    #endregion


                }
                lists.Add(t);
            }
            return lists;
        }

        public static List DataTableToList2(DataTable dt)
        {
            List lists = new List();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                T t = Activator.CreateInstance();
                //获取当前T对象的所有属性
                PropertyInfo[] propertys = t.GetType().GetProperties();
                //通过属性集合迭代出每一个属性对象
                foreach (PropertyInfo item in propertys)
                {
                    int index = dt.Columns.IndexOf(item.Name);// datatable 中列名不区分大小写,
                    if (index>=0)//dt.Columns.Contains(item.Name),用index读取值速度要更好一些
                    {
                        //判断当前DataTable的单列值是否为null
                        if (dt.Rows[i][index] != DBNull.Value)
                            //将当前DataTable的单列值赋予相匹配的属性,否则赋予一个null值.
                            item.SetValue(t, (dt.Rows[i][index]), null);
                        else
                            item.SetValue(t, null, null);

                    }

                }
                lists.Add(t);
            }
            return lists;
        }

        public static List DataTableToList3(DataTable dt)
        {
            List lists = new List();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                T t = Activator.CreateInstance();
                //获取当前T对象的所有属性
                PropertyInfo[] propertys = t.GetType().GetProperties();
                //通过属性集合迭代出每一个属性对象
                foreach (PropertyInfo item in propertys)
                {
                    //int index = dt.Columns.IndexOf(item.Name);// datatable 中列名不区分大小写,
                    if (dt.Columns.Contains(item.Name))//dt.Columns.Contains(item.Name),用index读取值速度要更好一些
                    {
                        //判断当前DataTable的单列值是否为null
                        if (dt.Rows[i][item.Name] != DBNull.Value)
                            //将当前DataTable的单列值赋予相匹配的属性,否则赋予一个null值.
                            item.SetValue(t, (dt.Rows[i][item.Name]), null);
                        else
                            item.SetValue(t, null, null);

                    }

                }
                lists.Add(t);
            }
            return lists;
        }

    }

调用测试结果:

   DataTableTest test = new DataTableTest();
            test.TestColumsNameIngore();
  ![结果对比,数据量大的时候区别更明显](https://img-blog.csdn.net/20180105174828511?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWlxaW5nbGk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)    

你可能感兴趣的:(C#,.NET,使用技巧)