在實際開發過程中也許不少人也遇到過我同樣的需求:
需要獲取DataTable中某一列或幾列的含有的不同值,得到類似SQL中Group By的結果
1、傳統做法是遍歷DataTable(.NET Framework個版本通用)
/// 按照fieldName從sourceTable中選擇出不重復的行, /// 相當於select distinct fieldName1,fieldName2,,fieldNamen from sourceTable /// </summary> /// <param name="tableName">表名</param> /// <param name="sourceTable">源DataTable</param> /// <param name="fieldNames">列名數組</param> /// <returns>一個新的不含重復行的DataTable,列只包括fieldNames中指明的列</returns> public DataTable SelectDistinct(string tableName, DataTable sourceTable, string[] fieldNames) { DataTable dt = new DataTable( tableName ); object[] values = new object[fieldNames.Length]; string fields = ""; for ( int i = 0; i < fieldNames.Length; i++ ) { dt.Columns.Add( fieldNames[ i ], sourceTable.Columns[ fieldNames[ i ] ].DataType ); fields += fieldNames[ i ] + ","; } fields = fields.Remove( fields.Length - 1, 1 ); DataRow lastRow = null; foreach ( DataRow dr in sourceTable.Select( "", fields ) ) { if ( lastRow == null || !( RowEqual( lastRow, dr, dt.Columns ) ) ) { lastRow = dr; for ( int i = 0; i < fieldNames.Length; i++ ) { values[ i ] = dr[ fieldNames[ i ] ]; } dt.Rows.Add( values ); } } if ( ds != null && !ds.Tables.Contains( tableName ) ) { ds.Tables.Add( dt ); } return dt; }
2、簡單代碼實現方式(只適用於.NET Framework2.0及以后版本)
DataTable SourceTable
=
new
SourseTable(); SourceTable.Columns.Add(
"
Code
"
,
string
);
//
...向SourseTable中添加數據
DataView view
=
new
DataView(SourceTable);
string
[] columns
=
{
"
Code
"
}
DataTable tarTable = view.ToTable(true,columns);//得到目標
3、使用Linq to Sql(只適用於.NET Framework3.5及以后版本)
