首页 > 代码库 > C#----List<>,DataTable,DataView的使用

C#----List<>,DataTable,DataView的使用

  首先申明一下,写此博文的目的是纪录一下,知识都是现成的,只是整理一下,为了让自己更容易看懂,比在其他地方更容易明白。因为它们太常用了,不忍心每次都去用那么长的时间查看MSDN,希望能在这里用理少的时间来理解并运用其用法。最终目标是减少从接触到能理解并使用的时间。

 List<T>类型的查找操作Find

   

 1             Point pt; 2             List<Point> lstPs = new List<Point>(); 3             for (int i = 0; i < 10; i++) 4             { 5                 pt = new Point(i, i + 100); 6                 lstPs.Add(pt); 7             } 8             Point pp = lstPs.Find( delegate(Point p)//pp是结果Point,是查到的目标 9             {10                 return p.X == 9;//这个是有目标的情况,如果没有这个X==9的这个点呢?11             });12             Point ppNo = lstPs.Find(delegate(Point p)13             {14                 return p.X == 1000;//如果队列中没有目标点,返回的是Point类型的默认值15             });16             Console.WriteLine("目标点是:"+pp);17             Console.WriteLine("没有发现目标点时得到的是默认值:" + ppNo);18             /*19              返回结果如下:20               目标点是:{X=9,Y=109}21               没有发现目标点时得到的是默认值:{X=0,Y=0}22              */

   结论:使用Find方法时要注意return 语句后面是bool类型的表达式,不是想当然的返回一个目标T类型,这里是Point类型。在List中有目标就查到目标,如果没有话就返回 T类型的默认值(default(T)可得到)。

 DataTable的使用

   1、添加列

  2、添加行

  3、查找数据select方法的使用

            DataTable dtAll = new DataTable();            //下面建立列过程:分别添加名为ID的列,名为name的列,名为score的列,类型分别是long,string,float。            DataColumn dc = new DataColumn("ID", typeof(long));            dtAll.Columns.Add(dc);            dc = new DataColumn("name", typeof(string));            dtAll.Columns.Add(dc);            dc = new DataColumn("score", typeof(float));            dtAll.Columns.Add(dc);            //为表添加行            DataRow dr = dtAll.NewRow();            dr[0] = 2009000;//其实是一个装箱过程,把int装箱为object            dr[1] = "john";            dr[2] = 98.5;            dtAll.Rows.Add(dr);            dr = dtAll.NewRow();            dr[0] = 2009001;            dr[1] = "Lucy";            dr[2] = 23.5;            dtAll.Rows.Add(dr);            DataRow[] drs = dtAll.Select("ID=2009000");            Console.WriteLine(drs[0][2]);//查找到的第一个人的分数score,结果是当然的98.5

 

  几个需要注意的地方。第一、先添加列,而不是先添加行,在添加列后再补充每行;第二、向第n行的第m列添加数据时是一个装箱过程,取出目标数据时需要拆箱操作,一般是Convert.To***方法;第三、查寻时的过滤条件是string,语法是SQL相仿。

  一个例子:查找条件不同时的结果。

    

 1             DataTable dt = new DataTable(); 2             for (int i = 0; i < 2; i++)//加两列 3             { 4                 DataColumn dc = new DataColumn(); 5                 if (i == 0) 6                 { 7                     dc.ColumnName = "we"; 8                     dc.DataType = typeof(int); 9                 }10                 dt.Columns.Add(dc);11             }12 13             DataRow dr = dt.NewRow();14             dr[0] = 99;15             dr[1] = "ddd";16             dt.Rows.Add(dr);17 18             dr = dt.NewRow();19             dr[0] = 80;20             dr[1] = "808080";21             dt.Rows.Add(dr);22 23             string condition = "we>70 and we<" + 90;24             DataRow[] drs = dt.Select(condition);25             string tmp = drs[0][1].ToString();//能输出正常结果,根据条件condition的不同输出不同的结果26             Console.WriteLine(tmp);

  condition作为条件,使用SQL语法 .

 DataView的一些用法

   1、使用DataTable得到DataView时一个问题

  原始有问题的代码如下:

1             DataView dvClass = booksClass.dtClass.DefaultView;2             DataView dvChild = booksClass.dtClass.DefaultView;3             dvClass.RowFilter="father=‘11‘";4             dvChild.RowFilter = "father=‘22‘";

 

  这样做后,回头再看发现dvClass 和 dvChild的RowFilter是相同的,都是"father=‘22‘";原来是因为dvClass dvChild引用了同一个实例。所以修改如下:

1             DataView dvChild = new DataView(booksClass.dtClass);// booksClass.dtClass.DefaultView;2             dvClass.RowFilter = "father=‘11‘";3             dvChild.RowFilter = "father=‘222‘";

 

  问题得以解决,两个DataView就变得独立了。