ListExtension 扩展方法增加 转DataTable()方法
方法
1.判断集合是否为Null
2.判断集合是否不为Null
3.判断集合是否有值
4.拼接成字符串
5.根据一个表达式去除重复
6.转DataTable 泛型对象转换方法
/// <summary>
/// 集合扩展方法
/// </summary>
public static class ListExtension
{/// <summary>/// 判断集合是否为Null/// </summary>/// <typeparam name="T"></typeparam>/// <param name="list"></param>/// <returns></returns>public static bool IsNull<T>(this IEnumerable<T> list){return list == null;}/// <summary>/// 判断集合是否不为Null/// </summary>/// <typeparam name="T"></typeparam>/// <param name="list"></param>/// <returns></returns>public static bool IsNotNull<T>(this IEnumerable<T> list){return list != null;}/// <summary>/// 判断集合是否有值/// </summary>/// <typeparam name="T"></typeparam>/// <param name="list"></param>/// <returns></returns>public static bool IsHaveVal<T>(this IEnumerable<T> list){return list != null && list.Count() > 0;}/// <summary>/// 拼接成字符串/// </summary>/// <param name="list"></param>/// <param name="split">分隔筏</param>/// <returns></returns>public static string JoinToString(this IEnumerable<int> list, string split){if (list != null)return string.Join(split, list);return string.Empty;}/// <summary>/// 拼接成字符串/// </summary>/// <param name="list"></param>/// <param name="split">分隔筏</param>/// <returns></returns>public static string JoinToString(this IEnumerable<string> list, string split){if (list != null)return string.Format("'{0}'",string.Join("'" + split + "'", list));return string.Empty;}/// <summary>/// 根据一个表达式去除重复/// </summary>/// <typeparam name="TSource">数据源类型</typeparam>/// <typeparam name="TKey">过滤属性类型</typeparam>/// <param name="source">数据源集合</param>/// <param name="keySelector">过滤表达式</param>/// <returns></returns>public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector){HashSet<TKey> seenKeys = new HashSet<TKey>();foreach (TSource element in source){if (seenKeys.Add(keySelector(element))){yield return element;}}}/// <summary>/// 转DataTable 泛型对象转换方法/// </summary>/// <typeparam name="T"></typeparam>/// <param name="items"></param>/// <returns></returns>public static DataTable ToDataTable<T>(this List<T> items){DataTable dt = new DataTable(typeof(T).Name);// 创建列var props = typeof(T).GetProperties().ToList();foreach (PropertyInfo prop in props){dt.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);}// 填充数据foreach (T item in items){DataRow row = dt.NewRow();foreach (PropertyInfo prop in props){row[prop.Name] = prop.GetValue(item, null) ?? DBNull.Value;}dt.Rows.Add(row);}return dt;}/// <summary>/// 转DataTable 泛型对象转换方法/// </summary>/// <typeparam name="T"></typeparam>/// <param name="items"></param>/// <param name="columnList">数据库中列集合</param>/// <returns></returns>public static DataTable ToDataTableSTMF<T>(this List<T> items, List<string> columnList){DataTable dt = new DataTable(typeof(T).Name);// 创建列var props = typeof(T).GetProperties().ToList();foreach (var colName in columnList){var prop = props.FirstOrDefault(t => t.Name == colName);dt.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);}int count = 0;// 填充数据foreach (T item in items){//if (count > 10)//{// break;//}DataRow row = dt.NewRow();foreach (DataColumn itemColumn in dt.Columns){var prop = props.FirstOrDefault(t => t.Name == itemColumn.ColumnName);switch (prop.PropertyType.Name){case "Int32":case "Decimal":row[prop.Name] = prop.GetValue(item, null) ?? 0;break;case "String":row[prop.Name] = prop.GetValue(item, null) ?? string.Empty;break;case "Boolean":var valBit = prop.GetValue(item, null).ToBoolean();row[prop.Name] = valBit;break;default:row[prop.Name] = prop.GetValue(item, null) ?? string.Empty;break;}}#region MyRegion//foreach (PropertyInfo prop in props)//{// if (!_insertExcludeColumns.Contains(prop.Name))// {// //row[prop.Name] = prop.GetValue(item, null) ?? DBNull.Value;// switch (prop.PropertyType.Name)// {// case "Int32":// case "Decimal":// row[prop.Name] = prop.GetValue(item, null) ?? 0;// break;// case "String":// row[prop.Name] = prop.GetValue(item, null) ?? string.Empty;// break;// case "Boolean":// var valBit = prop.GetValue(item, null).ToBoolean();// row[prop.Name] = valBit;// break;// default:// row[prop.Name] = prop.GetValue(item, null) ?? string.Empty;// break;// }// //row[prop.Name] = prop.GetValue(item, null) ?? DBNull.Value;// }//} #endregiondt.Rows.Add(row);count++;}return dt;}
}