c#之DataTable的扩展方法
由于太懒了,很久没更新了。毕业了,得好好装逼学习了,不能一心想着完了。

目前创新互联已为1000多家的企业提供了网站建设、域名、网页空间、网站托管、服务器托管、企业网站设计、宁德网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
由于公司中的项目大量的使用DataTable,而每次对datatable进行操作的时候需要写很多相同的代码,所以秉着 装逼而学习 的态度,于是撸了几个扩展方法,记录下来,学习下。
class Program
{
public DataTable LinqTable = new DataTable();
void AddNewRow(int id, string name)
{
Random random = new Random();
DataRow newRow = LinqTable.NewRow();
Thread.Sleep(20);
newRow["id"] = id;
newRow["name"] = id + name;
newRow["salary"] = (float)random.Next(10000) / 100;
LinqTable.Rows.Add(newRow);
}
void MyTable()
{
LinqTable.Columns.Add(new DataColumn("id", typeof(int)));
LinqTable.Columns.Add(new DataColumn("name", typeof(string)));
LinqTable.Columns.Add(new DataColumn("salary", typeof(float)));
}
static void Main(string[] args)
{
Program program = new Program();
program.MyTable();
AddData(program);
ForEach(program);
Select(program);
SelectOne(program);
Contains(program);
SingleOrDefault(program);
AddColumnFiled(program);
AddColumnFiledTwo(program);
Max(program);
Console.ReadKey();
}
///
/// 给DataTable中的每条记录执行某个操作
///
/// DataTable
/// Func委托
static void ForEach(Program program)
{
Console.WriteLine("给DataTable中的每条记录执行某个操作");
ExMethod.ForEach(program.LinqTable, (DataRow row) =>
{
row["id"] = int.Parse(row["id"].ToString()) * 10;
});
for (var i = 0; i < program.LinqTable.Rows.Count; i++)
{
DataRow row = program.LinqTable.Rows[i];
foreach (var it in row.ItemArray)
{
Console.Write(it + " ");
}
Console.WriteLine();
}
Console.WriteLine();
}
///
/// 从DataTable中获取某个字段组成的集合
///
/// 字段的数据类型
/// DataTable
/// Func委托
/// IEnumerable
static void Select(Program program)
{
Console.WriteLine("从DataTable中获取某个字段组成的集合");
List list = (List)ExMethod.Select(program.LinqTable, "id");
foreach (var it in list)
{
Console.WriteLine(it);
}
Console.WriteLine();
}
///
/// 获取DataTable中某个字段符合给定条件的处理过的集合
///
///
///
///
///
///
static void SelectOne(Program program)
{
Console.WriteLine("获取DataTable中某个字段符合给定条件的处理过的集合");
List list = (List)ExMethod.Select(program.LinqTable, "id", (int x) =>
{
return x + 10;
});
foreach (var it in list)
{
Console.WriteLine(it);
}
Console.WriteLine();
}
///
/// 判断给定DataTable中是否存在某个字段值符合给定条件的记录
///
/// 给定字段的数据类型
/// DataTable
/// 字段名称
/// Func委托
/// True/False
static void Contains(Program program)
{
Console.WriteLine("判断给定DataTable中是否存在某个字段值符合给定条件的记录");
bool flg = ExMethod.Contains(program.LinqTable, "name", (string name) =>
{
return name.Equals("1 Max");
});
Console.WriteLine(flg.ToString());
Console.WriteLine();
}
///
/// 获取DataTable中符合某个条件的唯一记录
///
/// DataTable
/// Func委托
///
static void SingleOrDefault(Program program)
{
Console.WriteLine("获取DataTable中符合某个条件的唯一记录");
DataRow row = ExMethod.SingleOrDefault(program.LinqTable, "id", (int i) =>
{
return i == 10;
});
if (row != null)
{
foreach (var it in row.ItemArray)
{
Console.Write(it + " ");
}
Console.WriteLine();
}
Console.WriteLine();
}
///
/// 添加指定的列
///
///
///
///
static void AddColumnFiled(Program program)
{
Console.WriteLine("添加指定的列");
ExMethod.AddColumnFiled(program.LinqTable, "sex");
Console.WriteLine(program.LinqTable.Columns.Count);
Console.WriteLine();
}
///
/// 添加指定的列并且附默认值
///
///
///
///
///
static void AddColumnFiledTwo(Program program)
{
Console.WriteLine("添加指定的列并且附默认值");
ExMethod.AddColumnFiled(program.LinqTable, "job", "码农");
for (int i = 0; i < program.LinqTable.Rows.Count; i++)
{
DataRow row = program.LinqTable.Rows[i];
foreach (var it in row.ItemArray)
{
Console.Write(it + " ");
}
Console.WriteLine();
}
Console.WriteLine();
}
///
/// DataTable中某个字段具有最大值的记录
///
///
static void Max(Program program)
{
Console.WriteLine("DataTable中某个字段具有最大值的记录");
DataRow row = ExMethod.Max(program.LinqTable.Rows, () =>
{
return "salary";
});
foreach (var it in row.ItemArray)
{
Console.Write(it + " ");
}
Console.WriteLine();
}
#region 录入数据
static void AddData(Program program)
{
program.AddNewRow(1, " 小瀚");
program.AddNewRow(2, " 小明");
program.AddNewRow(3, " 小杰");
program.AddNewRow(4, " 小黄");
program.AddNewRow(5, " 小白");
program.AddNewRow(6, " 小李");
program.AddNewRow(7, " 张三");
program.AddNewRow(8, " 李四");
program.AddNewRow(9, " 帅哥");
program.AddNewRow(10, " CC");
}
#endregion
} 以下是扩展方法
public static class ExMethod
{
///
/// 给DataTable中的每条记录执行某个操作
///
///
///
public static void ForEach(this DataTable table, Action action)
{
for (int i = 0; i < table.Rows.Count; i++)
{
DataRow current = table.Rows[i];
action(current);
}
}
///
/// 从DataTable中获取某个字段组成的集合
///
///
///
///
///
public static IEnumerable Select(this DataTable dt, string name)
{
DataColumnCollection columns = dt.Columns;
IList iList = new List(dt.Rows.Count);
if (!columns.Contains(name)) return iList;
for (var i = 0; i < dt.Rows.Count; i++)
{
iList.Add((T)dt.Rows[i][name]);
}
return iList;
}
///
/// 获取DataTable中某个字段符合给定条件的处理过的集合
///
///
///
///
///
///
public static IEnumerable Select(this DataTable dt, string name, Func func)
{
DataColumnCollection columns = dt.Columns;
IList iList = new List();
if (!columns.Contains(name)) return iList;
for (int i = 0; i < dt.Rows.Count; i++)
{
iList.Add(func((T)dt.Rows[i][name]));
}
return iList;
}
///
/// 判断给定DataTable中是否存在某个字段值符合给定条件的记录
///
///
///
///
///
///
public static bool Contains(this DataTable dt, string name, Func func)
{
DataColumnCollection columns = dt.Columns;
if (!columns.Contains(name)) return false;
foreach (DataRow row in dt.Rows)
{
if (func((T)row[name]))
{
return true;
}
}
return false;
}
///
/// 获取DataTable中符合某个条件的唯一记录
///
///
///
///
///
///
public static DataRow SingleOrDefault(this DataTable dt, string name, Func func)
{
DataRow result = null;
long count = 0;
for (int i = 0; i < dt.Rows.Count; i++)
{
DataRow current = dt.Rows[i];
if (func((T)current[name]))
{
count++;
result = current;
}
}
switch (count)
{
case 0: return null;
case 1: return result;
}
return result;
}
///
/// 添加指定的列
///
///
///
///
public static void AddColumnFiled(this DataTable dt, string columnFiled)
{
if (!string.IsNullOrWhiteSpace(columnFiled))
{
dt.Columns.Add(columnFiled, typeof(T));
}
}
///
/// 添加指定的列并且附默认值
///
///
///
///
///
public static void AddColumnFiled(this DataTable dt, string columnFiled, T value)
{
if (!string.IsNullOrWhiteSpace(columnFiled))
{
dt.Columns.Add(columnFiled, typeof(T));
for (int i = 0; i < dt.Rows.Count; i++)
{
DataRow current = dt.Rows[i];
current[columnFiled] = value;
}
}
}
///
/// DataTable中某个字段具有最大值的记录
///
///
///
///
///
public static DataRow Max(this DataRowCollection collection, Func func)
{
string name = func();
DataTable dt = collection[0].Table;
DataColumnCollection columns = dt.Columns;
if (!columns.Contains(name)) return null;
Comparer comparer = Comparer.Default;
DataRow result = null;
T value = default(T);
foreach (DataRow row in collection)
{
if (comparer.Compare(value, (T)row[name]) < 0)
{
value = (T)row[name];
result = row;
}
}
return result;
}
} 以下是参考别人Deno写的几个扩展方法,如有不对,请多多指教!
本文标题:c#之DataTable的扩展方法
网页URL:http://www.jxjierui.cn/article/jocjop.html


咨询
建站咨询
