在DataTable中实现DataTable.Select("Distinct")功能/数组的方式实现DataTable中的distinct
2008-01-12 08:51
651 查看
们有时候需要对DataTable中数据进行Distinct处理,过滤掉重复的数据,本文给出了解决方法:
事例代码来源于:Erik Porter's Blog Select DISTINCT on DataTable http://weblogs.asp.net/eporter/archive/2005/02/10/370548.aspx 以及 HOWTOVisualC # .NET 中实现 DataSet SELECTDISTINCT Helper 类http://support.microsoft.com/?id=326176
/// <summary>
/// 返回执行Select distinct后的DataTable
/// </summary>
/// <param name="SourceTable">源数据表</param>
/// <param name="FieldNames">字段集</param>
/// <returns></returns>
private DataTable SelectDistinct(DataTable SourceTable, params string[] FieldNames)
{
object[] lastValues;
DataTable newTable;
DataRow[] orderedRows;
if (FieldNames == null || FieldNames.Length == 0)
throw new ArgumentNullException("FieldNames");
lastValues = new object[FieldNames.Length];
newTable = new DataTable();
foreach (string fieldName in FieldNames)
newTable.Columns.Add(fieldName, SourceTable.Columns[fieldName].DataType);
orderedRows = SourceTable.Select("", string.Join(",", FieldNames));
foreach (DataRow row in orderedRows)
{
if (!fieldValuesAreEqual(lastValues, row, FieldNames))
{
newTable.Rows.Add(createRowClone(row, newTable.NewRow(), FieldNames));
setLastValues(lastValues, row, FieldNames);
}
}
return newTable;
}
private bool fieldValuesAreEqual(object[] lastValues, DataRow currentRow, string[] fieldNames)
{
bool areEqual = true;
for (int i = 0; i < fieldNames.Length; i++)
{
if (lastValues[i] == null || !lastValues[i].Equals(currentRow[fieldNames[i]]))
{
areEqual = false;
break;
}
}
return areEqual;
}
private DataRow createRowClone(DataRow sourceRow, DataRow newRow, string[] fieldNames)
{
foreach (string field in fieldNames)
newRow[field] = sourceRow[field];
return newRow;
}
private void setLastValues(object[] lastValues, DataRow sourceRow, string[] fieldNames)
{
for (int i = 0; i < fieldNames.Length; i++)
lastValues[i] = sourceRow[fieldNames[i]];
}
使用:
DataTable dt=(System.Data.DataTable)this.ViewState["Mydt"];
string[] fileds={"Filed1","Filed2"};//DISTINCT字段数组
DataTable newdt=this.SelectDistinct(dt,fileds);//返回过滤后的DataTable
-======================================================================================
M_id, M_name两个字段数据相同的DataRow必须是连续的,不能被分隔
string sql = string.Format("select M_id, M_name from dbo.BusinessWaitTable order by M_id, M_name");
DataTable dt = GetDataTable(sql);
//得出datatable中所有行放入数组
DataRow[] drs = dt.Select();
//存放过滤后DataRow的可变长度数组
ArrayList al = new ArrayList();
//源数组不为空,开始过滤
if (drs.Length != 0)
{
//先加入源数组第一个元素
al.Add(drs[0]);
/*遍历源数组元素,
* 将与目标数组最后一个元素不同的源数组元素加入到目标数组*/
for (int i = 0; i < drs.Length; i++)
{
if (drs[i]["M_id"].ToString() != ((DataRow)al[al.Count - 1])["M_id"].ToString()
&& drs[i]["M_name"].ToString() != ((DataRow)al[al.Count - 1])["M_name"].ToString())
{
al.Add(drs[i]);
}
}
}
2 用数组的方式实现DataTable中的distinct
事例代码来源于:Erik Porter's Blog Select DISTINCT on DataTable http://weblogs.asp.net/eporter/archive/2005/02/10/370548.aspx 以及 HOWTOVisualC # .NET 中实现 DataSet SELECTDISTINCT Helper 类http://support.microsoft.com/?id=326176
/// <summary>
/// 返回执行Select distinct后的DataTable
/// </summary>
/// <param name="SourceTable">源数据表</param>
/// <param name="FieldNames">字段集</param>
/// <returns></returns>
private DataTable SelectDistinct(DataTable SourceTable, params string[] FieldNames)
{
object[] lastValues;
DataTable newTable;
DataRow[] orderedRows;
if (FieldNames == null || FieldNames.Length == 0)
throw new ArgumentNullException("FieldNames");
lastValues = new object[FieldNames.Length];
newTable = new DataTable();
foreach (string fieldName in FieldNames)
newTable.Columns.Add(fieldName, SourceTable.Columns[fieldName].DataType);
orderedRows = SourceTable.Select("", string.Join(",", FieldNames));
foreach (DataRow row in orderedRows)
{
if (!fieldValuesAreEqual(lastValues, row, FieldNames))
{
newTable.Rows.Add(createRowClone(row, newTable.NewRow(), FieldNames));
setLastValues(lastValues, row, FieldNames);
}
}
return newTable;
}
private bool fieldValuesAreEqual(object[] lastValues, DataRow currentRow, string[] fieldNames)
{
bool areEqual = true;
for (int i = 0; i < fieldNames.Length; i++)
{
if (lastValues[i] == null || !lastValues[i].Equals(currentRow[fieldNames[i]]))
{
areEqual = false;
break;
}
}
return areEqual;
}
private DataRow createRowClone(DataRow sourceRow, DataRow newRow, string[] fieldNames)
{
foreach (string field in fieldNames)
newRow[field] = sourceRow[field];
return newRow;
}
private void setLastValues(object[] lastValues, DataRow sourceRow, string[] fieldNames)
{
for (int i = 0; i < fieldNames.Length; i++)
lastValues[i] = sourceRow[fieldNames[i]];
}
使用:
DataTable dt=(System.Data.DataTable)this.ViewState["Mydt"];
string[] fileds={"Filed1","Filed2"};//DISTINCT字段数组
DataTable newdt=this.SelectDistinct(dt,fileds);//返回过滤后的DataTable
-======================================================================================
M_id, M_name两个字段数据相同的DataRow必须是连续的,不能被分隔
string sql = string.Format("select M_id, M_name from dbo.BusinessWaitTable order by M_id, M_name");
DataTable dt = GetDataTable(sql);
//得出datatable中所有行放入数组
DataRow[] drs = dt.Select();
//存放过滤后DataRow的可变长度数组
ArrayList al = new ArrayList();
//源数组不为空,开始过滤
if (drs.Length != 0)
{
//先加入源数组第一个元素
al.Add(drs[0]);
/*遍历源数组元素,
* 将与目标数组最后一个元素不同的源数组元素加入到目标数组*/
for (int i = 0; i < drs.Length; i++)
{
if (drs[i]["M_id"].ToString() != ((DataRow)al[al.Count - 1])["M_id"].ToString()
&& drs[i]["M_name"].ToString() != ((DataRow)al[al.Count - 1])["M_name"].ToString())
{
al.Add(drs[i]);
}
}
}
2 用数组的方式实现DataTable中的distinct
相关文章推荐
- while select 的另一种实现方式"Next Table"
- 在DataTable中实现DataTable.Select("Distinct")功能
- 用数组的方式实现DataTable中的distinct(转)
- DataTable中实现select distinct功能
- 自己实现"后退"(含JS)的功能
- LINQ to Entities 实现sql 关键字"In"方式总结
- html5 input type="range"实现拖拉滑条功能
- 利用UICollectionView实现"新特性"功能demo
- JS:&quot;全选&quot;功能实现(checkbox)
- Android实习02:"摇一摇"功能的实现
- DataTable中执行DataTable.Select("条件")返回DataTable的方法
- C#实现"关闭计算机"功能
- "忘记密码"功能过程及其实现细节
- ExpandableListView实例(三)_实现QQ中"未分组"效果和"未分组"不可编辑删除功能
- [PHP] 原生PHP使用递归方式实现数组转换成XML的功能之思考
- 在HTML中增加meta name="viewport"控制页面不随着放大缩小变形的实现方式
- 如何实现"设为首页","加入收藏"的功能
- Asp.Net : 实现一个 DataSet 或DataTable SELECT DISTINCT (字段唯一性)
- 面程序的功能是将一个4×4的数组进行逆时针旋转90度后输出,要求原始数组的数据随机输入,原新数组以4行4列的方式输出
- 模块管理常规功能自定义系统的设计与实现(15--进一步完善"省份"模块)