C# Datatable筛选过滤的四种方法实现

 更新时间:2025年06月20日 10:43:54   作者:Nemo_XP  
本文主要介绍了C# Datatable筛选过滤的四种方法实现,包括Select、LINQ、DataView、动态条件,各方法在排序、性能及适用场景上有不同特点,感兴趣的可以了解一下

在C#中,DataTable提供了多种筛选过滤数据的方法,以下是常用的几种方式及其特点:

1. ‌Select方法筛选‌

这是最基础的筛选方式,支持类似SQL的表达式语法

// 单条件筛选
DataRow[] rows = dt.Select("Age > 25");

// 多条件组合
DataRow[] rows = dt.Select("Name LIKE '张%' AND Age > 20");

// 带排序的筛选
DataRow[] rows = dt.Select("Dept='销售部'", "HireDate DESC");

特点‌:

  • 返回DataRow[]数组
  • 条件表达式区分大小写
  • 性能中等,适合中小数据集

排序行为(需要注意:有主键会改变原始排序)‌

  • 无主键表‌:保持原始添加顺序
  • ‌有主键表‌:结果将按主键顺序排列
  • ‌显式指定排序‌:可通过第二个参数控制排序顺序

原因分析
DataTable.Select方法内部实现会优先考虑主键定义的顺序,这是为了优化数据检索性能。当表定义了主键时,.NET框架会默认按照主键顺序组织数据,以提高查询效率。

// 无排序参数时行为
DataRow[] rows1 = dt.Select("Age > 25"); // 顺序取决于是否有主键

// 显式指定排序
DataRow[] rows2 = dt.Select("Dept='销售部'", "HireDate DESC"); // 强制按指定字段排序

2. ‌LINQ查询‌

更现代的筛选方式,支持强类型和复杂逻辑

// 我常使用
var query = dt.AsEnumerable()
              .Where(row => row["Age"]?.toString() =="25");

// 基础查询
var query = dt.AsEnumerable()
              .Where(row => row.Field<int>("Age") > 25);

// 多条件+投影
var results = from row in dt.AsEnumerable()
              where row.Field<string>("Name").Contains("张")
              select new {
                  ID = row["ID"],
                  Name = row["Name"]
              };

优势‌:

  • 编译时类型检查
  • 支持复杂链式操作
  • 可读性更好

排序行为
‌无OrderBy/OrderByDescending‌:严格保持原始顺序
‌使用排序操作符‌:按指定规则重新排序
‌复合查询‌:最后一个排序操作决定最终顺序
原因分析
LINQ采用延迟执行模型,其设计原则之一是"不改变源数据顺序除非显式要求"。这是函数式编程思想的体现,确保操作的可预测性。

// 保持原始顺序
var query1 = dt.AsEnumerable().Where(row => row.Field<int>("Age") > 25);

// 显式排序
var query2 = from row in dt.AsEnumerable()
             orderby row.Field<DateTime>("CreateDate") descending
             select row;

3. ‌DataView过滤‌

适合需要绑定到UI控件的场景

DataView dv = new DataView(dt);
dv.RowFilter = "Status='Active'";
dv.Sort = "CreateTime DESC";

// 绑定到控件
dataGridView1.DataSource = dv;

‌特点‌:

  • 支持实时过滤
  • 自动同步源数据变化
  • 性能优于多次Select调用

排序行为

  • RowFilter 仅过滤不改变顺序
  • Sort 显式改变需单独设置
  • 两者组合 按Sort设置先过滤后排序

原因分析
DataView的设计将过滤(RowFilter)和排序(Sort)作为独立属性处理,这是为了支持UI数据绑定的灵活需求。这种分离允许开发者独立控制过滤条件和显示顺序

DataView dv = new DataView(dt);
dv.RowFilter = "Status='Active'"; // 不影响顺序
dv.Sort = "Salary DESC"; // 显式设置排序

4. ‌动态条件构建

适用于需要运行时生成条件的场景

string dynamicFilter = $"Age > {minAge}";
if (!string.IsNullOrEmpty(nameFilter)) 
    dynamicFilter += $" AND Name LIKE '%{nameFilter.Replace("'","''")}%'";

DataRow[] rows = dt.Select(dynamicFilter);

排序行为

  • 最终取决于使用的底层方法(Select或LINQ)
  • 条件表达式本身不影响排序

原因分析
动态构建的条件字符串只是改变了筛选条件,排序行为仍由执行筛选的方法决定。这是条件表达式与排序逻辑解耦的设计。

string condition = "Age > 30";
if(includeDepartment) 
    condition += " AND Dept='IT'";

// 排序取决于Select方法的第二个参数
DataRow[] rows = dt.Select(condition, "Name ASC"); 

性能对比建议

在这里插入图片描述

如何选择

  • 大数据集优先考虑DataView或添加索引
  • 复杂业务逻辑使用LINQ提升可维护性
  • 动态条件注意SQL注入风险,建议参数化
  • 频繁查询可缓存DataRow[]结果

特殊字符处理

当列名或值包含特殊字符时:

// 列名包含特殊字符
dt.Select("[#Rank] > 5"); 

// 值包含单引号
dt.Select($"Name='{input.Replace("'","''")}'");:ml-citation{ref="25,42" data="citationList"}

到此这篇关于C# Datatable筛选过滤各方式实现的文章就介绍到这了,更多相关C# Datatable筛选过滤内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#实现IDbConnection/IDbCommand等相关通用数据接口

    C#实现IDbConnection/IDbCommand等相关通用数据接口

    ADO.NET 中的数据提供者对象提供了IDbConnection、IDbCommand、IDbDataParameter等通用数据接口,本文将利用这些对象实现一个通用方法以访问和操作数据库内容,需要的朋友可以参考下
    2024-04-04
  • C# CancellationToken和CancellationTokenSource的用法详解

    C# CancellationToken和CancellationTokenSource的用法详解

    做了.net core之后,发现CancellationToken用的越来越平凡了。这也难怪,原来.net framework使用异步的不是很多,而.net core首推异步编程,到处可以看到Task的影子,而CancellationToken正好是异步Task的一个控制器,所以花点时间做个笔记
    2021-06-06
  • C#姓名脱敏的几种实现方法

    C#姓名脱敏的几种实现方法

    在C#中实现姓名脱敏,主要通过字符串处理来隐藏部分信息,保护用户隐私,下面就来详细的介绍一下几种实现方法,感兴趣的可以了解一下
    2025-11-11
  • C#生成DLL文件的方法

    C#生成DLL文件的方法

    这篇文章主要介绍了C#生成DLL文件的方法,较为详细的分析了使用C#生成DLL文件所涉及的相关技巧与实现方法,需要的朋友可以参考下
    2015-07-07
  • C#权限管理和设计浅谈

    C#权限管理和设计浅谈

    权限管理是很多软件中相当重要的一个模块——它的设计的好坏直接影响到软件的安全性、权限管理的可扩展性和易操作性 以及代码中权限判断的复杂程度和效率等方面
    2012-02-02
  • C#中的引用类型以及特殊引用类型详解

    C#中的引用类型以及特殊引用类型详解

    本文详细讲解了C#中的引用类型以及特殊引用类型,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • C# 无边框窗体边框阴影效果的简单实现

    C# 无边框窗体边框阴影效果的简单实现

    这篇文章介绍了C# 无边框窗体边框阴影效果的简单实现,有需要的朋友可以参考一下
    2013-10-10
  • Unity实现UI渐隐渐显效果

    Unity实现UI渐隐渐显效果

    这篇文章主要为大家详细介绍了Unity实现UI渐隐渐显效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • 浅谈Visual Studio 2019 Vue项目的目录结构

    浅谈Visual Studio 2019 Vue项目的目录结构

    这篇文章主要介绍了Visual Studio 2019 Vue项目 目录结构,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • 详解c# 并行计算

    详解c# 并行计算

    本文主要介绍了并行计算的简单使用,并行循环的中断和跳出、并行循环中为数组/集合添加项、返回集合运算结果/含有局部变量的并行循环、、PLinq(Linq的并行计算)等相关内容。
    2020-12-12

最新评论