关于DataTable与IList和List泛型集合的相互转换在网上总结

简介: 我在做amchart的还有微软相关的chart控件时发现绑定使用Datatabale不能绑定 但是支持DataSet 和泛型集合;于是谢谢网上好友的帮助;自己做了下总结 自己弄了一些集合转化的文章; 对于技术方面的理论我不需多言; 主要是是通过映射命名空间;使用Linq的相关查询;和Type类...

我在做amchart的还有微软相关的chart控件时发现绑定使用Datatabale不能绑定 但是支持DataSet 和泛型集合;于是谢谢网上好友的帮助;自己做了下总结

自己弄了一些集合转化的文章;

对于技术方面的理论我不需多言;

主要是是通过映射命名空间;使用Linq的相关查询;和Type类获取列名;使用泛型转化为实体类后放到集合:

代码如下:

 1 publicstaticclass ConvertTolistInfo
2 {
3 ///<summary>
4 /// DataTable 转换为List 集合
5 ///</summary>
6 ///<typeparam name="T">类型</typeparam>
7 ///<param name="dt">DataTable</param>
8 ///<returns></returns>
9 publicstatic List<TResult> ToList<TResult>(this DataTable dt) where TResult : class,new()
10 {
11 List<PropertyInfo> prlist =new List<PropertyInfo>();
12 Type t =typeof(TResult);
13 Array.ForEach<PropertyInfo>(t.GetProperties(), p => { if (dt.Columns.IndexOf(p.Name) !=-1)prlist.Add(p); });
14 List<TResult> objlist =new List<TResult>();
15 foreach (DataRow row in dt.Rows)
16 {
17 TResult obj =new TResult();
18 prlist.ForEach(p =>
19 {
20 if (row[p.Name] != DBNull.Value)
21 p.SetValue(obj, row[p.Name], null);
22 });
23 objlist.Add(obj);
24 }
25 return objlist;
26 }
27 ///<summary>
28 /// 转换为一个DataTable
29 ///</summary>
30 ///<typeparam name="T"></typeparam>
31 ///<param name="value"></param>
32 ///<returns></returns>
33 publicstatic DataTable ToDataTable<T>(this IEnumerable<T> value) where T : class
34 {
35 List<PropertyInfo> plist =new List<PropertyInfo>();
36 Type t =typeof(T);
37 //T type = new T();
38 //Type columen = type.GetType();这种方式与 where T :new()这种方式使用 否则不适用;
39 DataTable dt =new DataTable();
40 Array.ForEach<PropertyInfo>(t.GetProperties(), p =>
41 {
42 plist.Add(p);
43 dt.Columns.Add(p.Name, p.PropertyType);
44 });
45 foreach (var item in value)
46 {
47 //创建一个DataRow实例
48 DataRow row = dt.NewRow();
49 //给row 赋值
50 plist.ForEach(p => row[p.Name] = p.GetValue(item, null));
51 dt.Rows.Add(row);
52 }
53 return dt;
54 }
55 }

  二,构造泛型类:

/// <summary>
/// 实体转换辅助类
/// </summary>
publicclass ModelConvertHelper<T>where T : new()
{
publicstatic IList<T> ConvertToModel(DataTable dt)
{
// 定义集合
IList<T> ts =new List<T>();

// 获得此模型的类型
Type type =typeof(T);

string tempName ="";

foreach (DataRow dr in dt.Rows)
{
T t
=new T();

// 获得此模型的公共属性
PropertyInfo[] propertys = t.GetType().GetProperties();

foreach (PropertyInfo pi in propertys)
{
tempName
= pi.Name;

// 检查DataTable是否包含此列
if (dt.Columns.Contains(tempName))
{
// 判断此属性是否有Setter
if (!pi.CanWrite) continue;

object value = dr[tempName];
if (value != DBNull.Value)
pi.SetValue(t, value,
null);
}
}

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

/// <summary>          
/// 提供将DataTable类型对象转换为List集合          
/// </summary>          
/// <param name="table"></param>          
/// <returns></returns>  
publicstatic List<T> ConvertToList<T>(DataTable table) where T : new()
{
//置为垃圾对象 
List<T> list =null;
if (table !=null)
{
DataColumnCollection columns
= table.Columns;
int columnCount = columns.Count;
T type
=new T();
Type columnType
= type.GetType();
PropertyInfo[] properties
= columnType.GetProperties();
if (properties.Length == columnCount)
{
list
=new List<T>();
foreach (DataRow currentRow in table.Rows)
{
for (int i =0; i < columnCount; i++)
{
for (int j =0; j < properties.Length; j++)
{
if (columns[i].ColumnName == properties[j].Name)
{ properties[j].SetValue(type, currentRow[i],
null); }
}
}
list.Add(type); type
=new T();
}
}
else { list =null; }
}
else
{
thrownew ArgumentNullException("参数不能为空");
}
return list;
}

}

  

目录
相关文章
|
3月前
|
存储 安全 Java
【Java集合类面试二十五】、有哪些线程安全的List?
线程安全的List包括Vector、Collections.SynchronizedList和CopyOnWriteArrayList,其中CopyOnWriteArrayList通过复制底层数组实现写操作,提供了最优的线程安全性能。
|
3月前
|
安全
List集合特有功能
List集合特有功能
38 2
|
3月前
|
Java
【Java集合类面试二十三】、List和Set有什么区别?
List和Set的主要区别在于List是一个有序且允许元素重复的集合,而Set是一个无序且元素不重复的集合。
|
3月前
|
存储 Java
Java学习笔记 List集合的定义、集合的遍历、迭代器的使用
Java学习笔记 List集合的定义、集合的遍历、迭代器的使用
|
23天前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
52 5
|
1月前
|
存储 分布式计算 NoSQL
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
25 3
|
2月前
|
NoSQL Java Redis
List集合按照由小到大排序或者由大到小排序
List集合按照由小到大排序或者由大到小排序
22 3
|
3月前
|
存储 安全 Java
java集合框架复习----(2)List
这篇文章是关于Java集合框架中List集合的详细复习,包括List的特点、常用方法、迭代器的使用,以及ArrayList、Vector和LinkedList三种实现类的比较和泛型在Java中的使用示例。
java集合框架复习----(2)List
|
3月前
|
存储 安全 Java
java集合框架复习----(4)Map、List、set
这篇文章是Java集合框架的复习总结,重点介绍了Map集合的特点和HashMap的使用,以及Collections工具类的使用示例,同时回顾了List、Set和Map集合的概念和特点,以及Collection工具类的作用。
java集合框架复习----(4)Map、List、set
|
3月前
|
Java
用JAVA架建List集合为树形结构的代码方法
这段代码定义了一个表示树形结构的 `Node` 类和一个用于构建树形结构的 `TreeController`。`Node` 类包含基本属性如 `id`、`pid`、`name` 和 `type`,以及子节点列表 `children`。`TreeController` 包含初始化节点列表并将其转换为树形结构的方法。通过过滤和分组操作实现树形结构的构建。详情可见:[代码示例链接1](http://www.zidongmutanji.com/zsjx/43551.html),[代码效果参考链接2](https://www.257342.com/sitemap/post.html)。
41 5

热门文章

最新文章