有些时候需要从DataTable中选择出在某个列上相同的值。但是DataTable.Select没有提供这样的语法。于是,微软和一些其他大虾提供了解决方案。
据说以下这个是最快的:
private static 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 static 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 static DataRow createRowClone(DataRow sourceRow, DataRow newRow, string[] fieldNames)
{
foreach (string field in fieldNames)
newRow[field] = sourceRow[field];
return newRow;
}
private static void setLastValues(object[] lastValues, DataRow sourceRow, string[] fieldNames)
{
for (int i = 0; i < fieldNames.Length; i++)
lastValues[i] = sourceRow[fieldNames[i]];
}
资料链接:
http://weblogs.asp.net/eporter/archive/2005/02/10/370548.aspx
http://www.thescripts.com/forum/thread253513.html
http://support.microsoft.com/default.aspx?scid=kb;en-us;326176#1
.NET 2.0中还有一个DataView类的ToTable方法,但是据说很慢。
顺别推荐一个.NET面试题的网站:
http://www.dotnetuncle.com/aspnet/71_page_life_cycle.aspx
分享到:
相关推荐
用C#实现对DataTable的JOIN,GROUP BY,FILTER,UNIONALL,DISTINCT
两个datatable,t1和t2 t2是t1的子集,用linq去掉t1中包含t2的数据
Datatable 是 ADO.NET 中的一个重要组件,用于存储和管理内存中的数据。它可以独立于数据库存在,数据可以来自多个源,包括数据库、XML 等。Datatable 提供了灵活的数据存储和管理方式,支持数据的添加、删除、修改...
本文将深入探讨如何在C#中利用DataTable进行`GroupBy`、`OrderBy`和`Distinct`操作,以提升数据处理的效率和灵活性。 首先,`GroupBy`操作是将数据根据特定的列或多个列进行分组,通常用于对数据进行聚合计算,如...
详细描述如何使用C# 去除DataTable中的重复列,根据列名去重保留其他列
本文实例讲述了C#中datatable去重的方法,分享给大家供大家参考。具体方法如下: 这里主要介绍两种方法: 1 数据库直接去除重复 代码如下:select distinct * from 表名 去除了重复行distinct 2 对 DataTable直接...
本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。 ——Matt Warren,微软主架构师,LINQ之父 LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐! ——...
SQL Server提供了诸如`DISTINCT`关键字、`GROUP BY`语句以及`EXISTS`子句等工具来处理重复数据,这些可以直接在数据库中执行,而无需将所有数据加载到内存中。 总之,`MergeDataTable`方法提供了一个便捷的方式,...
### 七、在ADO.NET中,对于Command对象的ExecuteNonQuery()方法和ExecuteReader()方法,下面叙述错误的是(C)。 - **知识点**: ADO.NET中数据操作 - **解析**: `ExecuteNonQuery()`用于执行更新数据的操作,`...
vs2005针对datatable已经有封装好的去重复方法: 代码如下://去掉重复行 DataView dv = table.DefaultView; table = dv.ToTable(true, new string[] { “name”, “code” }); 此时table 就只有name、code无重复...
这里使用了SQL的DISTINCT关键字来获取唯一值,同时利用窗口函数COUNT(*) OVER (PARTITION BY ...)进行分组计数。这个查询可能用于统计每个系统(SYS_ID)下的员工数量。在.NET中,这样的SQL语句通常会与ADO.NET库...
LinQ是什么?... Motif, MotifPlus, ...)在不同LinQ服务器上注册的用户可以相互通讯可以运行在Windows和Linux平台上联系方式作者: 张勇 (z-yong163@163.com)开发者邮件列表: myicq-devel@cosoft.org.cn
在处理DataTable时,我们可以使用`DataRowComparer.Default`来比较DataRow的值,确保结果中没有重复的行。 ```csharp var dt = new DataTable(); // 添加数据... IEnumerable<DataRow> distinctRows = dt....
* ValueMember:在ComboBox中显示的值对应的隐藏值 我们可以使用DataSource、DisplayMember和ValueMember三个属性来实现自动把数据集添加到ComboBox中,例如: ```csharp private void FillComboBox(ComboBox cbx) ...
在使用这个存储过程前,确保你已经在SQL SERVER 2000中创建了`DataTable`表,并且文件路径和文件名符合参数`@folderPath`和`@fileNamePattern`的要求。例如,如果你的文件位于`C:\ImportFiles`目录下,文件名为`data...
当用户选择日期后,可以更新`TextBox`控件中的值: ```csharp private void Rili_SelectionChanged(object sender, EventArgs e) { timeTBox.Text = Rili.SelectedDate.ToShortDateString(); Rili.Visible = ...
在IT领域,特别是软件开发与数据库交互中,`treeview`绑定数据库是一项常见且重要的技术,它主要用于展示层次结构数据,如组织结构、目录结构等。本文将深入探讨如何使用C#语言结合SQL Server数据库实现`treeview`...
0808 在C#应用程序中控制输入法 488 0809 打开“区域和语言选项”对话框并指定选项卡 489 0810 如何执行命令行命令? 489 0811 如何修改计算机的默认打印机 490 0812 如何实现行业软件系统注销功能 490 ...