-
#region DataTable筛选,排序返回符合条件行组成的新DataTable或直接用DefaultView按条件返回 /// <summary> /// DataTable筛选,排序返回符合条件行组成的新DataTable或直接用DefaultView按条件返回 /// eg:SortExprDataTable(dt,"Sex='男'","Time Desc",1) /// </summary> /// <param name="dt">传入的DataTable</param> /// <param name="strExpr">筛选条件</param> /// <param name="strSort">排序条件</param> /// <param name="mode">1,直接用DefaultView按条件返回,效率较高;2,DataTable筛选,排序返回符合条件行组成的新DataTable</param> public static DataTable SortDataTable(DataTable dt, string strExpr, string strSort, int mode) { switch (mode) { case 1: //方法一 直接用DefaultView按条件返回 dt.DefaultView.RowFilter = strExpr; dt.DefaultView.Sort = strSort; return dt; case 2: //方法二 DataTable筛选,排序返回符合条件行组成的新DataTable DataTable dt1 = new DataTable(); DataRow[] GetRows = dt.Select(strExpr, strSort); //复制DataTable dt结构不包含数据 dt1 = dt.Clone(); foreach (DataRow row in GetRows) { dt1.Rows.Add(row.ItemArray); } return dt1; default: return dt; } } #endregion #region 获取DataTable前几条数据 /// <summary> /// 获取DataTable前几条数据 /// </summary> /// <param name="TopItem">前N条数据</param> /// <param name="oDT">源DataTable</param> /// <returns></returns> public static DataTable DtSelectTop(int TopItem, DataTable oDT) { if (oDT.Rows.Count < TopItem) return oDT; DataTable NewTable = oDT.Clone(); DataRow[] rows = oDT.Select("1=1"); for (int i = 0; i < TopItem; i++) { NewTable.ImportRow((DataRow)rows[i]); } return NewTable; } #endregion #region 获取DataTable中指定列的数据 /// <summary> /// 获取DataTable中指定列的数据 /// </summary> /// <param name="dt">数据源</param> /// <param name="tableName">新的DataTable的名词</param> /// <param name="strColumns">指定的列名集合</param> /// <returns>返回新的DataTable</returns> public static DataTable GetTableColumn(DataTable dt, string tableName, params string[] strColumns) { DataTable dtn = new DataTable(); if (dt == null) { throw new ArgumentNullException("参数dt不能为null"); } try { dtn = dt.DefaultView.ToTable(tableName, true, strColumns); } catch (Exception e) { throw new Exception(e.Message); } return dtn; } #endregion
Select()
Select(string filterExpression)
Select(string filterExpression, string sort)
Select(string filterExpression,string sort, DataViewRowState record States)。
1) Select()——获取所有 System.Data.DataRow 对象的数组。
2) Select(string filterExpression)——按照主键顺序(如果没有主键,则按照添加顺序)获取与筛选条件相匹配的所有 System.Data.DataRow 对象的数组。
3) Select(string filterExpression, string sort)——获取按照指定的排序顺序且与筛选条件相匹配的所有 System.Data.DataRow 对象的数组。
4) Select(string filterExpression, string sort, DataViewRowState recordStates)——获取与排序顺序中的筛选器以及指定的状态相匹配的所有 System.Data.DataRow 对象的数组。
演示示例:
1 using System; 2 3 using System.Collections.Generic; 4 5 using System.Text; 6 7 using System.Data; 8 9 10 11 namespace TestDataTableSelect 12 13 { 14 15 class Program 16 17 { 18 19 static DataTable dt = new DataTable(); 20 21 static void Main(string[] args) 22 23 { 24 25 DataColumn dc1 = new DataColumn("id"); 26 27 dc1.DataType=typeof(int); 28 29 DataColumn dc2 = new DataColumn("name"); 30 31 dc2.DataType=typeof(System.String); 32 33 dt.Columns.Add(dc1); 34 35 dt.Columns.Add(dc2); 36 37 for (int i = 1; i <=10;i++ ) 38 39 { 40 41 DataRow dr = dt.NewRow(); 42 43 if (i <= 5) 44 45 { 46 47 dr[0] = i; 48 49 dr[1] = i + "--" + "hello"; 50 51 } 52 53 else 54 55 { 56 57 dr[0] = i; 58 59 dr[1] = i + "--" + "nihao"; 60 61 } 62 63 dt.Rows.Add(dr); 64 65 } 66 67 68 69 Select(); 70 71 Select("id>='3' and name='3--hello'");//支持and 72 73 Select("id>='3' or id='1'");//支持or 74 75 Select("name like '%hello%'");//支持like 76 77 Select("id>5","id desc"); 78 79 Select("id>5", "id desc",DataViewRowState.Added); 80 81 } 82 83 84 85 private static void Select() 86 87 { 88 89 DataRow[] arrayDR = dt.Select(); 90 91 foreach(DataRow dr in arrayDR) 92 93 { 94 95 Console.WriteLine(dr[0].ToString()+" "+dr[1].ToString()); 96 97 } 98 99 Console.ReadLine(); 100 101 } 102 103 104 105 private static void Select(string filterExpression) 106 107 { 108 109 DataRow[] arrayDR = dt.Select(filterExpression); 110 111 foreach (DataRow dr in arrayDR) 112 113 { 114 115 Console.WriteLine(dr[0].ToString() + " " + dr[1].ToString()); 116 117 } 118 119 Console.ReadLine(); 120 121 } 122 123 124 125 private static void Select(string filterExpression, string sort) 126 127 { 128 129 DataRow[] arrayDR = dt.Select(filterExpression,sort); 130 131 foreach (DataRow dr in arrayDR) 132 133 { 134 135 Console.WriteLine(dr[0].ToString() + " " + dr[1].ToString()); 136 137 } 138 139 Console.ReadLine(); 140 141 } 142 143 144 145 private static void Select(string filterExpression, string sort, DataViewRowState recordStates) 146 147 { 148 149 DataRow[] arrayDR = dt.Select(filterExpression, sort,recordStates); 150 151 foreach (DataRow dr in arrayDR) 152 153 { 154 155 Console.WriteLine(dr[0].ToString() + " " + dr[1].ToString()); 156 157 } 158 159 Console.ReadLine(); 160 161 } 162 163 } 164 165 }
注意事项:上面的Select操作是大小写不敏感的(记录的字段不敏感),如果需要区分大小写,需要将DataTable的caseSensitive属性设为true。
将DataRow 转换成DataTable
1 public DataTable ToDataTable(DataRow[] rows) 2 { 3 if (rows == null || rows.Length == 0) 4 { 5 return null; 6 } 7 else 8 { 9 DataTable tmp = rows[0].Table.Clone(); 10 foreach (DataRow row in rows) 11 { 12 tmp.Rows.Add(row.ItemArray); // 将DataRow添加到DataTable中 13 } 14 return tmp; 15 } 16 }
将一个datatable晒选后替换到另一个里面去
1 DataTable dd;//定义原数据 2 DataTable data = dt.Clone(); 3 foreach (DataRow item in dd.Rows) 4 { 5 DataRow[] row = dd.Select("xxx=" + item["Id"].ToIntValue()); 6 //data.Row.Add(row[0]);//这样写报错 7 data.ImportRow(row[0]); 8 }
-