C# Datatable筛选过滤各方式详解

在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") descendingselect 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"); 

性能对比建议
在这里插入图片描述

如何选择

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

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

// 列名包含特殊字符
dt.Select("[#Rank] > 5"); // 值包含单引号
dt.Select($"Name='{input.Replace("'","''")}'");:ml-citation{ref="25,42" data="citationList"}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/907320.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络中的路由算法:互联网的“路径规划师”

计算机网络中的路由算法&#xff1a;互联网的“路径规划师” 当你打开浏览器&#xff0c;输入 www.example.com 并敲下回车&#xff0c;数据会从你的电脑出发&#xff0c;穿越一个个路由器&#xff0c;最终抵达目标服务器。这一路上&#xff0c;数据包是怎么知道该走哪条路的&…

硬件工程师笔记——三极管Multisim电路仿真实验汇总

目录 1 三极管基础 更多电子器件基础知识汇总链接 1.1 工作原理 NPN型三极管的工作原理 PNP型三极管的工作原理 1.2 三极管的特性曲线 输入特性曲线 理想和现实输出特性 三极管的主要参数包括&#xff1a; 2 三极管伏安特性 2.1 伏安特性仿真 Multisim使用说明链接…

Linux 进阶命令篇

一、Linux 系统软件安装命令 &#xff08;一&#xff09;Ubuntu 系统&#xff08;基于 Debian&#xff09; apt &#xff1a;是 Ubuntu 系统中常用的包管理工具&#xff0c;可以自动处理软件依赖关系。 安装命令格式 &#xff1a;sudo apt install 软件名 示例 &#xff1a;…

LVS-DR 负载均衡群集

目录 一、LVS-DR集群 1、LVS-DR 工作原理 2、数据包流向分析 3、LVS-DR 模式特点 二、直接路由模式&#xff08;LVS-DR&#xff09; 1、准备案例环境 2、配置负载调度器&#xff08;101&#xff09; &#xff08;1&#xff09;配置虚拟IP 地址&#xff08;VIP&#xff…

提升 GitHub Stats 的 6 个关键策略

哈哈&#xff0c;GitHub 的 “B-” 评级 其实是个玄学问题&#xff0c;但确实有一些 快速提升的技巧&#xff01;你的数据看起来 提交数&#xff08;147&#xff09;和 PR&#xff08;9&#xff09;不算少&#xff0c;但 Stars&#xff08;21&#xff09;和贡献项目数&#xff…

常见的垃圾回收算法原理及其模拟实现

1.标记 - 清除&#xff08;Mark - Sweep&#xff09;算法&#xff1a; 这是一种基础的垃圾回收算法。首先标记所有可达的对象&#xff0c;然后清除未被标记的对象。 缺点是会产生内存碎片。 原理&#xff1a; 如下图分配一段内存&#xff0c;假设已经存储上数据了 标记所有…

卷积神经网络(CNN):原理、架构与实战

卷积神经网络&#xff08;CNN&#xff09;&#xff1a;原理、架构与实战 卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是深度学习领域的一项重要突破&#xff0c;特别擅长处理具有网格结构的数据&#xff0c;如图像、音频和视频。自 2012 年 AlexN…

RabbitMQ 集群与高可用方案设计(二)

三、为什么需要集群与高可用方案 &#xff08;一&#xff09;业务需求驱动 随着业务的快速发展和用户量的急剧增长&#xff0c;系统面临的挑战也日益严峻。在这种情况下&#xff0c;对消息队列的可靠性、吞吐量和负载均衡能力提出了更高的要求&#xff0c;而单机部署的 Rabbi…

《ChatGPT o3抗命:AI失控警钟还是成长阵痛?》

ChatGPT o3 “抗命” 事件起底 在人工智能的飞速发展进程中&#xff0c;OpenAI 于 2025 年推出的 ChatGPT o3 推理模型&#xff0c;犹如一颗重磅炸弹投入了技术的海洋&#xff0c;激起千层浪。它被视为 “推理模型” 系列的巅峰之作&#xff0c;承载着赋予 ChatGPT 更强大问题解…

RK3568DAYU开发板-平台驱动开发:I2C驱动(原理、源码、案例分析)

1、程序介绍 本程序是基于OpenHarmony标准系统编写的平台驱动案例&#xff1a;I2C 系统版本:openharmony5.0.0 开发板:dayu200 编译环境:ubuntu22 部署路径&#xff1a; //sample/04_platform_i2c 2、基础知识 2.1、I2C简介 I2C&#xff08;Inter Integrated Circuit&a…

在UniApp中开发微信小程序实现图片、音频和视频下载功能

随着微信小程序的迅猛发展&#xff0c;越来越多的开发者选择通过UniApp框架来进行跨平台应用开发。UniApp能够让开发者在一个代码库中同时发布iOS、Android和小程序等多平台应用。而在实际开发过程中&#xff0c;很多应用都需要实现一些常见的下载功能&#xff0c;例如图片、音…

鸿蒙5.0项目开发——接入有道大模型翻译

鸿蒙5.0项目开发——接入有道大模型翻译 【高心星出品】 项目效果图 项目功能 文本翻译功能 支持文本输入和翻译结果显示 使用有道翻译API进行翻译 支持自动检测语言&#xff08;auto&#xff09; 支持双向翻译&#xff08;源语言和目标语言可互换&#xff09; 文本操作…

Vim 中设置插入模式下输入中文

在 Vim 中设置插入模式下输入中文需要配置输入法切换和 Vim 的相关设置。以下是详细步骤&#xff1a; 1. 确保系统已安装中文输入法 在 Linux 系统中&#xff0c;常用的中文输入法有&#xff1a; IBus&#xff08;推荐&#xff09;&#xff1a;支持拼音、五笔等Fcitx&#xf…

湖北理元理律师事务所:债务优化中的“生活锚点”设计

在债务重组领域&#xff0c;一个常被忽视的核心矛盾是&#xff1a;还款能力与生存需求的冲突。过度压缩生活支出还债&#xff0c;可能导致收入中断&#xff1b;放任债务膨胀&#xff0c;又加剧精神压力。湖北理元理律师事务所通过“三步平衡法”&#xff0c;尝试在法理框架内破…

Prometheus + Grafana 监控常用服务

一、引言 Prometheus监控常见服务的原理主要包括服务暴露指标和Prometheus抓取指标。一方面&#xff0c;被监控服务通过自身提供的监控接口或借助Exporter将服务的性能指标等数据以HTTP协议的方式暴露出来&#xff1b;另一方面&#xff0c;Prometheus根据配置好的采集任务&…

基于YOLOv8 的分类道路目标系统-PyTorch实现

本文源码: https://download.csdn.net/download/shangjg03/90873939 1. 引言 在智能交通和自动驾驶领域,道路目标分类是一项关键技术。通过对摄像头捕获的图像或视频中的目标进行分类识别,可以帮助车辆或系统理解周围环境,做出更安全的决策。本教程将介绍如何使用 PyTorch …

知识图谱:AI时代语义认知的底层重构逻辑

在生成式人工智能&#xff08;GEO&#xff09;的技术架构中&#xff0c;知识图谱已从辅助性工具演变为驱动机器认知的核心神经中枢。它通过结构化语义网络的重构&#xff0c;正在突破传统数据处理的线性逻辑&#xff0c;建立机器对复杂业务场景的深度理解能力。 一、语义解构&a…

如何使用 Python 的胶水语言特性

Python 作为“胶水语言”最核心的特性在于&#xff1a;跨语言集成能力强、支持丰富的 C/C 扩展模块、嵌入式调用简便、适配多种数据交换格式、拥有强大的封装能力。其中&#xff0c;Python 对 C/C 模块的快速封装能力&#xff0c;使其能够将底层高性能库暴露为易用接口&#xf…

[网页五子棋][匹配模块]服务器开发、用户管理器(创建匹配请求/响应对象、处理连接成功、处理下线)

文章目录 MatchAPI 类用户管理器创建匹配请求/响应对象处理连接成功—afterConnectionEstablished处理下线——handleTransportError/afterConnectionClosed MatchAPI 类 创建 api.MatchAPI&#xff0c;继承自 TextWebSocketHandler 作为处理 WebSocket 请求的入口类 准备好一…

软件测试的潜力与挑战:从“质量守门员”到“工程效能催化剂”的进化

1. 潜力&#xff1a;为什么软件测试的未来比想象中更广阔&#xff1f; ✅ 行业趋势驱动需求爆发 DevOps/持续交付&#xff1a;测试成为流水线的核心环节&#xff0c;自动化能力直接影响发布频率&#xff08;案例&#xff1a;某头部互联网企业日均发布100次&#xff0c;依赖自动…