`
didasoft
  • 浏览: 165033 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

在DataTable中选择Distinct的值

阅读更多

有些时候需要从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

    用C#实现对DataTable的JOIN,GROUP BY,FILTER,UNIONALL,DISTINCT

    利用linq给两个datatable去重

    两个datatable,t1和t2 t2是t1的子集,用linq去掉t1中包含t2的数据

    datatable使用详解

    Datatable 是 ADO.NET 中的一个重要组件,用于存储和管理内存中的数据。它可以独立于数据库存在,数据可以来自多个源,包括数据库、XML 等。Datatable 提供了灵活的数据存储和管理方式,支持数据的添加、删除、修改...

    c# datatable 操作类

    本文将深入探讨如何在C#中利用DataTable进行`GroupBy`、`OrderBy`和`Distinct`操作,以提升数据处理的效率和灵活性。 首先,`GroupBy`操作是将数据根据特定的列或多个列进行分组,通常用于对数据进行聚合计算,如...

    C# DataTable去重,根据列名去重保留其他列

    详细描述如何使用C# 去除DataTable中的重复列,根据列名去重保留其他列

    C#中datatable去重的方法

    本文实例讲述了C#中datatable去重的方法,分享给大家供大家参考。具体方法如下: 这里主要介绍两种方法: 1 数据库直接去除重复 代码如下:select distinct * from 表名 去除了重复行distinct 2 对 DataTable直接...

    LINQ 实战 1/11

     本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。  ——Matt Warren,微软主架构师,LINQ之父  LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐!  ——...

    sqlserver合并DataTable并排除重复数据的通用方法分享

    SQL Server提供了诸如`DISTINCT`关键字、`GROUP BY`语句以及`EXISTS`子句等工具来处理重复数据,这些可以直接在数据库中执行,而无需将所有数据加载到内存中。 总之,`MergeDataTable`方法提供了一个便捷的方式,...

    asp.net面试题

    ### 七、在ADO.NET中,对于Command对象的ExecuteNonQuery()方法和ExecuteReader()方法,下面叙述错误的是(C)。 - **知识点**: ADO.NET中数据操作 - **解析**: `ExecuteNonQuery()`用于执行更新数据的操作,`...

    删除DataTable重复列,只删除其中的一列重复行的解决方法

    vs2005针对datatable已经有封装好的去重复方法: 代码如下://去掉重复行 DataView dv = table.DefaultView; table = dv.ToTable(true, new string[] { “name”, “code” }); 此时table 就只有name、code无重复...

    .net经典(工作中积累的经验)

    这里使用了SQL的DISTINCT关键字来获取唯一值,同时利用窗口函数COUNT(*) OVER (PARTITION BY ...)进行分组计数。这个查询可能用于统计每个系统(SYS_ID)下的员工数量。在.NET中,这样的SQL语句通常会与ADO.NET库...

    LinQ (LinK You, or Linux Q)

    LinQ是什么?... Motif, MotifPlus, ...)在不同LinQ服务器上注册的用户可以相互通讯可以运行在Windows和Linux平台上联系方式作者: 张勇 (z-yong163@163.com)开发者邮件列表: myicq-devel@cosoft.org.cn

    详解LINQ入门(下篇)

    在处理DataTable时,我们可以使用`DataRowComparer.Default`来比较DataRow的值,确保结果中没有重复的行。 ```csharp var dt = new DataTable(); // 添加数据... IEnumerable&lt;DataRow&gt; distinctRows = dt....

    C#基本控件用法(winform,原创)

    * ValueMember:在ComboBox中显示的值对应的隐藏值 我们可以使用DataSource、DisplayMember和ValueMember三个属性来实现自动把数据集添加到ComboBox中,例如: ```csharp private void FillComboBox(ComboBox cbx) ...

    导入多个文件至SQL SERVER数据库(亲测可用)

    在使用这个存储过程前,确保你已经在SQL SERVER 2000中创建了`DataTable`表,并且文件路径和文件名符合参数`@folderPath`和`@fileNamePattern`的要求。例如,如果你的文件位于`C:\ImportFiles`目录下,文件名为`data...

    C#常用代码

    当用户选择日期后,可以更新`TextBox`控件中的值: ```csharp private void Rili_SelectionChanged(object sender, EventArgs e) { timeTBox.Text = Rili.SelectedDate.ToShortDateString(); Rili.Visible = ...

    treeview绑定数据库

    在IT领域,特别是软件开发与数据库交互中,`treeview`绑定数据库是一项常见且重要的技术,它主要用于展示层次结构数据,如组织结构、目录结构等。本文将深入探讨如何使用C#语言结合SQL Server数据库实现`treeview`...

    C#开发经验技巧宝典

    0808 在C#应用程序中控制输入法 488 0809 打开“区域和语言选项”对话框并指定选项卡 489 0810 如何执行命令行命令? 489 0811 如何修改计算机的默认打印机 490 0812 如何实现行业软件系统注销功能 490 ...

Global site tag (gtag.js) - Google Analytics