由于太懒了,很久没更新了。毕业了,得好好装逼学习了,不能一心想着完了。

由于公司中的项目大量的使用DataTable,而每次对datatable进行操作的时候需要写很多相同的代码,所以秉着 装逼而学习 的态度,于是撸了几个扩展方法,记录下来,学习下。

classProgram{publicDataTableLinqTable=newDataTable();voidAddNewRow(intid,stringname){Randomrandom=newRandom();DataRownewRow=LinqTable.NewRow();Thread.Sleep(20);newRow["id"]=id;newRow["name"]=id+name;newRow["salary"]=(float)random.Next(10000)/100;LinqTable.Rows.Add(newRow);}voidMyTable(){LinqTable.Columns.Add(newDataColumn("id",typeof(int)));LinqTable.Columns.Add(newDataColumn("name",typeof(string)));LinqTable.Columns.Add(newDataColumn("salary",typeof(float)));}staticvoidMain(string[]args){Programprogram=newProgram();program.MyTable();AddData(program);ForEach(program);Select(program);SelectOne(program);Contains(program);SingleOrDefault(program);AddColumnFiled(program);AddColumnFiledTwo(program);Max(program);Console.ReadKey();}///<summary>///给DataTable中的每条记录执行某个操作///</summary>///<paramname="table">DataTable</param>///<paramname="func">Func委托</param>staticvoidForEach(Programprogram){Console.WriteLine("给DataTable中的每条记录执行某个操作");ExMethod.ForEach(program.LinqTable,(DataRowrow)=>{row["id"]=int.Parse(row["id"].ToString())*10;});for(vari=0;i<program.LinqTable.Rows.Count;i++){DataRowrow=program.LinqTable.Rows[i];foreach(varitinrow.ItemArray){Console.Write(it+"");}Console.WriteLine();}Console.WriteLine();}///<summary>///从DataTable中获取某个字段组成的集合///</summary>///<typeparamname="T">字段的数据类型</typeparam>///<paramname="table">DataTable</param>///<paramname="selector">Func委托</param>///<returns>IEnumerable</returns>staticvoidSelect(Programprogram){Console.WriteLine("从DataTable中获取某个字段组成的集合");List<int>list=(List<int>)ExMethod.Select<int>(program.LinqTable,"id");foreach(varitinlist){Console.WriteLine(it);}Console.WriteLine();}///<summary>///获取DataTable中某个字段符合给定条件的处理过的集合///</summary>///<typeparamname="T"></typeparam>///<paramname="dt"></param>///<paramname="name"></param>///<paramname="func"></param>///<returns></returns>staticvoidSelectOne(Programprogram){Console.WriteLine("获取DataTable中某个字段符合给定条件的处理过的集合");List<int>list=(List<int>)ExMethod.Select<int>(program.LinqTable,"id",(intx)=>{returnx+10;});foreach(varitinlist){Console.WriteLine(it);}Console.WriteLine();}///<summary>///判断给定DataTable中是否存在某个字段值符合给定条件的记录///</summary>///<typeparamname="T">给定字段的数据类型</typeparam>///<paramname="table">DataTable</param>///<paramname="name">字段名称</param>///<paramname="predicate">Func委托</param>///<returns>True/False</returns>staticvoidContains(Programprogram){Console.WriteLine("判断给定DataTable中是否存在某个字段值符合给定条件的记录");boolflg=ExMethod.Contains<String>(program.LinqTable,"name",(stringname)=>{returnname.Equals("1Max");});Console.WriteLine(flg.ToString());Console.WriteLine();}///<summary>///获取DataTable中符合某个条件的唯一记录///</summary>///<paramname="table">DataTable</param>///<paramname="predicate">Func委托</param>///<returns></returns>staticvoidSingleOrDefault(Programprogram){Console.WriteLine("获取DataTable中符合某个条件的唯一记录");DataRowrow=ExMethod.SingleOrDefault<int>(program.LinqTable,"id",(inti)=>{returni==10;});if(row!=null){foreach(varitinrow.ItemArray){Console.Write(it+"");}Console.WriteLine();}Console.WriteLine();}///<summary>///添加指定的列///</summary>///<typeparamname="T"></typeparam>///<paramname="dt"></param>///<paramname="columnFiled"></param>staticvoidAddColumnFiled(Programprogram){Console.WriteLine("添加指定的列");ExMethod.AddColumnFiled<string>(program.LinqTable,"sex");Console.WriteLine(program.LinqTable.Columns.Count);Console.WriteLine();}///<summary>///添加指定的列并且附默认值///</summary>///<typeparamname="T"></typeparam>///<paramname="dt"></param>///<paramname="columnFiled"></param>///<paramname="value"></param>staticvoidAddColumnFiledTwo(Programprogram){Console.WriteLine("添加指定的列并且附默认值");ExMethod.AddColumnFiled<string>(program.LinqTable,"job","码农");for(inti=0;i<program.LinqTable.Rows.Count;i++){DataRowrow=program.LinqTable.Rows[i];foreach(varitinrow.ItemArray){Console.Write(it+"");}Console.WriteLine();}Console.WriteLine();}///<summary>///DataTable中某个字段具有最大值的记录///</summary>///<paramname="program"></param>staticvoidMax(Programprogram){Console.WriteLine("DataTable中某个字段具有最大值的记录");DataRowrow=ExMethod.Max<float>(program.LinqTable.Rows,()=>{return"salary";});foreach(varitinrow.ItemArray){Console.Write(it+"");}Console.WriteLine();}#region录入数据staticvoidAddData(Programprogram){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}

以下是扩展方法

publicstaticclassExMethod{///<summary>///给DataTable中的每条记录执行某个操作///</summary>///<paramname="table"></param>///<paramname="action"></param>publicstaticvoidForEach(thisDataTabletable,Action<DataRow>action){for(inti=0;i<table.Rows.Count;i++){DataRowcurrent=table.Rows[i];action(current);}}///<summary>///从DataTable中获取某个字段组成的集合///</summary>///<typeparamname="T"></typeparam>///<paramname="dt"></param>///<paramname="name"></param>///<returns></returns>publicstaticIEnumerable<T>Select<T>(thisDataTabledt,stringname){DataColumnCollectioncolumns=dt.Columns;IList<T>iList=newList<T>(dt.Rows.Count);if(!columns.Contains(name))returniList;for(vari=0;i<dt.Rows.Count;i++){iList.Add((T)dt.Rows[i][name]);}returniList;}///<summary>///获取DataTable中某个字段符合给定条件的处理过的集合///</summary>///<typeparamname="T"></typeparam>///<paramname="dt"></param>///<paramname="name"></param>///<paramname="func"></param>///<returns></returns>publicstaticIEnumerable<T>Select<T>(thisDataTabledt,stringname,Func<T,T>func){DataColumnCollectioncolumns=dt.Columns;IList<T>iList=newList<T>();if(!columns.Contains(name))returniList;for(inti=0;i<dt.Rows.Count;i++){iList.Add(func((T)dt.Rows[i][name]));}returniList;}///<summary>///判断给定DataTable中是否存在某个字段值符合给定条件的记录///</summary>///<typeparamname="T"></typeparam>///<paramname="dt"></param>///<paramname="name"></param>///<paramname="func"></param>///<returns></returns>publicstaticboolContains<T>(thisDataTabledt,stringname,Func<T,bool>func){DataColumnCollectioncolumns=dt.Columns;if(!columns.Contains(name))returnfalse;foreach(DataRowrowindt.Rows){if(func((T)row[name])){returntrue;}}returnfalse;}///<summary>///获取DataTable中符合某个条件的唯一记录///</summary>///<typeparamname="T"></typeparam>///<paramname="dt"></param>///<paramname="name"></param>///<paramname="func"></param>///<returns></returns>publicstaticDataRowSingleOrDefault<T>(thisDataTabledt,stringname,Func<T,bool>func){DataRowresult=null;longcount=0;for(inti=0;i<dt.Rows.Count;i++){DataRowcurrent=dt.Rows[i];if(func((T)current[name])){count++;result=current;}}switch(count){case0:returnnull;case1:returnresult;}returnresult;}///<summary>///添加指定的列///</summary>///<typeparamname="T"></typeparam>///<paramname="dt"></param>///<paramname="columnFiled"></param>publicstaticvoidAddColumnFiled<T>(thisDataTabledt,stringcolumnFiled){if(!string.IsNullOrWhiteSpace(columnFiled)){dt.Columns.Add(columnFiled,typeof(T));}}///<summary>///添加指定的列并且附默认值///</summary>///<typeparamname="T"></typeparam>///<paramname="dt"></param>///<paramname="columnFiled"></param>///<paramname="value"></param>publicstaticvoidAddColumnFiled<T>(thisDataTabledt,stringcolumnFiled,Tvalue){if(!string.IsNullOrWhiteSpace(columnFiled)){dt.Columns.Add(columnFiled,typeof(T));for(inti=0;i<dt.Rows.Count;i++){DataRowcurrent=dt.Rows[i];current[columnFiled]=value;}}}///<summary>///DataTable中某个字段具有最大值的记录///</summary>///<typeparamname="T"></typeparam>///<paramname="collection"></param>///<paramname="selector"></param>///<returns></returns>publicstaticDataRowMax<T>(thisDataRowCollectioncollection,Func<string>func){stringname=func();DataTabledt=collection[0].Table;DataColumnCollectioncolumns=dt.Columns;if(!columns.Contains(name))returnnull;Comparer<T>comparer=Comparer<T>.Default;DataRowresult=null;Tvalue=default(T);foreach(DataRowrowincollection){if(comparer.Compare(value,(T)row[name])<0){value=(T)row[name];result=row;}}returnresult;}}

以下是参考别人Deno写的几个扩展方法,如有不对,请多多指教!