工作中看到一段需要动态转换模型的代码,当数据比较多的时候,效率会慢,经过试验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();
