using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Collections;
namespace XHSoft.LicenseManagerUI
{
/// <summary>
/// 扩展属性
/// </summary>
public static class Extensions
{
#region 数据集转换泛型集合扩展
/// <summary>
/// DataSet转换为泛型集合
/// </summary>
/// <typeparam name="T">泛型类型</typeparam>
/// <param name="ds">DataSet数据集</param>
/// <param name="tableIndex">待转换数据表索引,默认第0张表</param>
/// <returns>返回泛型集合</returns>
public static IList<T> ToList<T>(this DataSet ds, int tableIndex = 0)
{
if (ds == null || ds.Tables.Count < 0) return null;
if (tableIndex > ds.Tables.Count - 1)
return null;
if (tableIndex < 0)
tableIndex = 0;
DataTable dt = ds.Tables[tableIndex];
// 返回值初始化
IList<T> result = new List<T>();
for (int j = 0; j < dt.Rows.Count; j++)
{
T _t = (T)Activator.CreateInstance(typeof(T));
PropertyInfo[] propertys = _t.GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
for (int i = 0; i < dt.Columns.Count; i++)
{
// 属性与字段名称一致的进行赋值
if (pi.Name.Equals(dt.Columns[i].ColumnName))
{
// 数据库NULL值单独处理
if (dt.Rows[j][i] != DBNull.Value)
pi.SetValue(_t, dt.Rows[j][i], null);
else
pi.SetValue(_t, null, null);
break;
}
}
}
result.Add(_t);
}
return result;
}
/// <summary>
/// DataTable转换为泛型集合
/// </summary>
/// <typeparam name="T">泛型类型</typeparam>
/// <param name="dt">DataTable数据表</param>
/// <returns>返回泛型集合</returns>
public static IList<T> ToList<T>(this DataTable dt) where T:class,new()
{
if (dt == null || dt.Rows.Count <= 0) return null;
List<T> list =new List<T>();
#region 方法一:
//T model;
//Type infos = typeof(T);
////object tempValue;
//foreach (DataRow dr in dt.Rows)
//{
// model = new T();
// 1.
// infos.GetProperties().ToList().ForEach(p =>p.SetValue(model, dr[p.Name], null));
// 2.
// //infos.GetProperties().ToList().ForEach(p =>
// //{
// // tempValue = dr[p.Name];
// // if (!string.IsNullOrEmpty(tempValue.ToString()))
// // p.SetValue(model, tempValue, null);
// //});
// list.Add(model);
//}
#endregion
#region 方法二: 比方法一快
PropertyInfo[] propertys = typeof(T).GetProperties();
for (int j = 0; j < dt.Rows.Count; j++)
{
T _t = (T)Activator.CreateInstance(typeof(T));
foreach (PropertyInfo pi in propertys)
{
// 属性与字段名称一致的进行赋值
if (pi.Name.Equals(dt.Columns[pi.Name].ColumnName))
{
if (dt.Rows[j][pi.Name] != DBNull.Value)
pi.SetValue(_t, dt.Rows[j][pi.Name], null);
else
pi.SetValue(_t, null, null);
}
}
list.Add(_t);
}
#endregion
return list;
}
/// <summary>
/// DataSet转换为泛型集合
/// </summary>
/// <typeparam name="T">泛型类型</typeparam>
/// <param name="ds">DataSet数据集</param>
/// <param name="tableName">待转换数据表名称,名称为空时默认第0张表</param>
/// <returns>返回泛型集合</returns>
public static IList<T> ToList<T>(this DataSet ds, string tableName)
{
int _TableIndex = 0;
if (ds == null || ds.Tables.Count < 0)
return null;
if (string.IsNullOrEmpty(tableName))
return ToList<T>(ds, 0);
for (int i = 0; i < ds.Tables.Count; i++)
{
// 获取Table名称在Tables集合中的索引值
if (ds.Tables[i].TableName.Equals(tableName))
{
_TableIndex = i;
break;
}
}
return ToList<T>(ds, _TableIndex);
}
#endregion
#region 泛型集合转换为数据集扩展
/// <summary>
/// 将泛型集合转换成DataSet数据集
/// </summary>
/// <typeparam name="T">T类型</typeparam>
/// <param name="list">泛型集合</param>
/// <returns>DataSet数据集</returns>
public static DataSet ToDataSet<T>(this IList<T> list)
{
Type elementType = typeof(T);
var ds = new DataSet();
var t = new DataTable();
ds.Tables.Add(t);
elementType.GetProperties().ToList().ForEach(propInfo => t.Columns.Add(propInfo.Name, Nullable.GetUnderlyingType(propInfo.PropertyType) ?? propInfo.PropertyType));
foreach (T item in list)
{
var row = t.NewRow();
elementType.GetProperties().ToList().ForEach(propInfo => row[propInfo.Name] = propInfo.GetValue(item, null) ?? DBNull.Value);
t.Rows.Add(row);
}
return ds;
}
/// <summary>
/// 泛型集合转换成DataTable表
/// </summary>
/// <typeparam name="T">T类型</typeparam>
/// <param name="list">泛型集合</param>
/// <returns>DataTable表</returns>
public static DataTable ToDataTable<T>(this IList<T> list)
{
return ToDataTable(list, null);
}
/// <summary>
/// 泛型集合转换成DataTable表
/// </summary>
/// <typeparam name="T">T类型</typeparam>
/// <param name="list">泛型集合</param>
/// <param name="_tableName">Table名称</param>
/// <returns>DataTable表</returns>
public static DataTable ToDataTable<T>(this IList<T> list, string _tableName)
{
Type elementType = typeof(T);
var dt = new DataTable();
if (_tableName == "null")
dt.TableName = _tableName;
elementType.GetProperties().ToList().ForEach(propInfo => dt.Columns.Add(propInfo.Name, Nullable.GetUnderlyingType(propInfo.PropertyType) ?? propInfo.PropertyType));
foreach (T item in list)
{
var row = dt.NewRow();
elementType.GetProperties().ToList().ForEach(propInfo => row[propInfo.Name] = propInfo.GetValue(item, null) ?? DBNull.Value);
dt.Rows.Add(row);
}
return dt;
}
#endregion
#region 以下为IEnumerable扩展实现
/// <summary>
/// 给非强类型的IEnumerable返回头一个元素。
/// </summary>
public static object First(this IEnumerable col)
{
foreach (var item in col)
return item;
throw new IndexOutOfRangeException();
}
/// <summary>
/// 给非强类型的IEnumerable返回头一个强类型的元素
/// </summary>
public static object First<T>(this IEnumerable col)
{
return (T)col.First();
}
/// <summary>
/// 基本上和List<T>的ForEach方法一致。
/// </summary>
public static void Each<T>(this IEnumerable<T> col, Action<T> handler)
{
foreach (var item in col)
handler(item);
}
/// <summary>
/// 带索引的遍历方法。
/// </summary>
public static void Each<T>(this IEnumerable<T> col, Action<T, int> handler)
{
int index = 0;
foreach (var item in col)
handler(item, index++);
}
/// <summary>
/// 可以半途中断执行的遍历方法。
/// </summary>
public static void Each<T>(this IEnumerable<T> col, Func<T, bool> handler)
{
foreach (var item in col)
if (!handler(item)) break;
}
/// <summary>
/// 可以半途中段的带索引的遍历方法。
/// </summary>
public static void Each<T>(this IEnumerable<T> col, Func<T, int, bool> handler)
{
int index = 0;
foreach (var item in col)
if (!handler(item, index++)) break;
}
#endregion
#region 以下为IEnumerable<T>的非泛型实现
public static void Each<T>(this IEnumerable col, Action<object> handler)
{
foreach (var item in col)
handler(item);
}
public static void Each<T>(this IEnumerable col, Action<object, int> handler)
{
int index = 0;
foreach (var item in col)
handler(item, index++);
}
public static void Each<T>(this IEnumerable col, Func<object, bool> handler)
{
foreach (var item in col)
if (!handler(item)) break;
}
public static void Each<T>(this IEnumerable col, Func<object, int, bool> handler)
{
int index = 0;
foreach (var item in col)
if (!handler(item, index++)) break;
}
#endregion
}
}

C# DataTable,DataSet,IList,IEnumerable 互转扩展属性的更多相关文章

  1. C#高效导出Excel(IList转DataTable,DataSet)

    微软的Excel操作类导出Excel会很慢,此方法简单的把表中内容以字符串的形式写入到Excel中,用到的一个技巧就是"\t". C#中的\t相当于Tab键,写入到Excel中时就 ...

  2. DataTable,List,Dictonary互转,筛选及相关写法

    1.创建自定义DataTable  /// 创建自定义DataTable(一) 根据列名字符串数组, /// </summary> /// <param name="sLi ...

  3. DataTable 和Json 字符串互转

    #region DataTable 转换为Json字符串实例方法 /// <summary> /// GetClassTypeJosn 的摘要说明 /// </summary> ...

  4. DateTable与List<T>相互转换 及JSON与DataTable(DataSet)相互转化

    http://www.360doc.com/content/13/0712/09/10504424_299336674.shtml Linq处理List数据 http://blog.163.com/l ...

  5. Newtonsoft.Json高级用法DataContractJsonSerializer,JavaScriptSerializer 和 Json.NET即Newtonsoft.Json datatable,dataset,modle,序列化

    原文地址:https://www.cnblogs.com/yanweidie/p/4605212.html Newtonsoft.Json介绍 在做开发的时候,很多数据交换都是以json格式传输的.而 ...

  6. Newtonsoft.Json高级用法,json序列号,model反序列化,支持序列化和反序列化DataTable,DataSet,Entity Framework和Entity,字符串

    原文地址:https://www.cnblogs.com/yanweidie/p/4605212.html 手机端应用讲究速度快,体验好.刚好手头上的一个项目服务端接口有性能问题,需要进行优化.在接口 ...

  7. 完整DataTable与IList互换(转)

    public class CollectionHelper { private CollectionHelper() { } public static DataTable ConvertTo< ...

  8. IEnumerable接口的扩展方法

    /// <summary>/// IEnumerable接口的扩展方法,支持它的实现类是List的情况/// </summary>using System.Collection ...

  9. DataTable和List集合互转

    /// <summary> /// 将集合转换成DataTable /// </summary> /// <param name="list"> ...

随机推荐

  1. SQLite 语法(http://www.w3cschool.cc/sqlite/sqlite-syntax.html)

    SQLite 语法 SQLite 是遵循一套独特的称为语法的规则和准则.本教程列出了所有基本的 SQLite 语法,向您提供了一个 SQLite 快速入门. 大小写敏感性 有个重要的点值得注意,SQL ...

  2. 【Netty源码学习】DefaultChannelPipeline(三)

    上一篇博客中[Netty源码学习]ChannelPipeline(二)我们介绍了接口ChannelPipeline的提供的方法,接下来我们分析一下其实现类DefaultChannelPipeline具 ...

  3. 即时通讯软件openfire+spark+smack

    所以我基本上分为三篇文章来介绍此类软件的开发: 第一篇是关于XMPP 协议是啥,IM 是啥以及一个比较有名的开源实现,该开源实现包括三个部分(Spark.Smack和Openfire): 第二篇讲如何 ...

  4. 压力测试工具Ab简介

    Apache安装包中自带的压力测试工具 Apache Benchmark(简称ab) 简单易用,这里就采用 ab作为压力测试工具了. 1.独立安装 通过 yum-utils中的yumdownload  ...

  5. javascript之事件模型

    事件模型 冒泡型事件(Bubbling):事件由叶子节点沿祖先节点一直向上传递到根节点 捕获型事件(Capturing):由DOM树最顶元素一直到最精确的元素,与冒泡型事件相反 DOM标准事件模型:D ...

  6. 【一天一道LeetCode】#242. Valid Anagram

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given t ...

  7. Java --Annotation学习心得体会及笔记

    相对于注释这种给程序员看的信息: 注解,就是给程序看的解释性的语言,其作用就相当于配置文件的存在.其存在的意义在于以下几点: 优点: 方便的使程序员看到相关项的关联位置及关联方式等信息. 缺点: 由于 ...

  8. Java EE 之 过滤器入门学习与总结(1)

    使用Filter技术来配合开发会使得开发变得简单起来.简单的一个例子就表现在"乱码问题"上.不使用Filter的话,我们有可能需要为每一个网页设置字符编码集,如request.se ...

  9. Android(Lollipop/5.0) Material Design(二) 入门指南

    Material Design系列 Android(Lollipop/5.0)Material Design(一) 简介 Android(Lollipop/5.0)Material Design(二) ...

  10. 网站开发进阶(三十四)编码中的setCharacterEncoding 理解

    编码中的setCharacterEncoding 理解 1.pageEncoding="UTF-8"的作用是设置JSP编译成Servlet时使用的编码. 2.contentType ...