C#的DataTable类精简汇总

目录

一、DataTable概述

1.创建 DataTable

2.添加行

3.修改行

4.删除行

5.查询行

6.排序行

7.合并 DataTable

8.克隆 DataTable

9.复制 DataTable

10.使用 DataView 过滤和排序

11.使用 DataTable 的事件

12.使用 DataTable 的约束

13.使用 DataTable 的表达式列

14.使用 DataTable 的 XML 序列化

15.使用 DataTable 的 JSON 序列化

二、总结


一、DataTable概述

C# 中的 DataTable 是一个非常重要的类,用于在内存中存储和操作数据。它类似于数据库中的表,具有行和列的结构。下面是一个详细的教程,涵盖了 DataTable 的常见操作方法,并提供了相应的示例代码。

1.创建 DataTable

首先,我们需要创建一个 DataTable 对象,并为其添加列。

using System;
using System.Data;class Program
{static void Main(){// 创建 DataTableDataTable table = new DataTable("MyTable");// 添加列table.Columns.Add("ID", typeof(int));table.Columns.Add("Name", typeof(string));table.Columns.Add("Age", typeof(int));// 打印表结构foreach (DataColumn column in table.Columns){Console.WriteLine(column.ColumnName + " - " + column.DataType);}}
}

2.添加行

我们可以使用 NewRow() 方法创建新行,并将其添加到 DataTable 中。

using System;
using System.Data;class Program
{static void Main(){DataTable table = new DataTable("MyTable");table.Columns.Add("ID", typeof(int));table.Columns.Add("Name", typeof(string));table.Columns.Add("Age", typeof(int));// 添加行DataRow row1 = table.NewRow();row1["ID"] = 1;row1["Name"] = "Alice";row1["Age"] = 25;table.Rows.Add(row1);DataRow row2 = table.NewRow();row2["ID"] = 2;row2["Name"] = "Bob";row2["Age"] = 30;table.Rows.Add(row2);// 打印行数据foreach (DataRow row in table.Rows){Console.WriteLine($"{row["ID"]}, {row["Name"]}, {row["Age"]}");}}
}

3.修改行

我们可以通过索引或条件查找行,并修改其数据。

using System;
using System.Data;class Program
{static void Main(){DataTable table = new DataTable("MyTable");table.Columns.Add("ID", typeof(int));table.Columns.Add("Name", typeof(string));table.Columns.Add("Age", typeof(int));DataRow row1 = table.NewRow();row1["ID"] = 1;row1["Name"] = "Alice";row1["Age"] = 25;table.Rows.Add(row1);DataRow row2 = table.NewRow();row2["ID"] = 2;row2["Name"] = "Bob";row2["Age"] = 30;table.Rows.Add(row2);// 修改行数据DataRow rowToUpdate = table.Rows[0];rowToUpdate["Name"] = "Alice Smith";rowToUpdate["Age"] = 26;// 打印修改后的行数据foreach (DataRow row in table.Rows){Console.WriteLine($"{row["ID"]}, {row["Name"]}, {row["Age"]}");}}
}

4.删除行

我们可以通过 Remove() 或 Delete() 方法删除行。

using System;
using System.Data;class Program
{static void Main(){DataTable table = new DataTable("MyTable");table.Columns.Add("ID", typeof(int));table.Columns.Add("Name", typeof(string));table.Columns.Add("Age", typeof(int));DataRow row1 = table.NewRow();row1["ID"] = 1;row1["Name"] = "Alice";row1["Age"] = 25;table.Rows.Add(row1);DataRow row2 = table.NewRow();row2["ID"] = 2;row2["Name"] = "Bob";row2["Age"] = 30;table.Rows.Add(row2);// 删除行table.Rows[0].Delete(); // 标记为删除table.AcceptChanges();  // 提交删除// 打印剩余行数据foreach (DataRow row in table.Rows){Console.WriteLine($"{row["ID"]}, {row["Name"]}, {row["Age"]}");}}
}

5.查询行

我们可以使用 Select() 方法查询符合条件的行。

using System;
using System.Data;class Program
{static void Main(){DataTable table = new DataTable("MyTable");table.Columns.Add("ID", typeof(int));table.Columns.Add("Name", typeof(string));table.Columns.Add("Age", typeof(int));DataRow row1 = table.NewRow();row1["ID"] = 1;row1["Name"] = "Alice";row1["Age"] = 25;table.Rows.Add(row1);DataRow row2 = table.NewRow();row2["ID"] = 2;row2["Name"] = "Bob";row2["Age"] = 30;table.Rows.Add(row2);// 查询行DataRow[] rows = table.Select("Age > 26");// 打印查询结果foreach (DataRow row in rows){Console.WriteLine($"{row["ID"]}, {row["Name"]}, {row["Age"]}");}}
}

6.排序行

我们可以使用 DefaultView.Sort 属性对行进行排序。

using System;
using System.Data;class Program
{static void Main(){DataTable table = new DataTable("MyTable");table.Columns.Add("ID", typeof(int));table.Columns.Add("Name", typeof(string));table.Columns.Add("Age", typeof(int));DataRow row1 = table.NewRow();row1["ID"] = 1;row1["Name"] = "Alice";row1["Age"] = 25;table.Rows.Add(row1);DataRow row2 = table.NewRow();row2["ID"] = 2;row2["Name"] = "Bob";row2["Age"] = 30;table.Rows.Add(row2);// 排序table.DefaultView.Sort = "Age DESC";// 打印排序后的行数据foreach (DataRowView rowView in table.DefaultView){DataRow row = rowView.Row;Console.WriteLine($"{row["ID"]}, {row["Name"]}, {row["Age"]}");}}
}

7.合并 DataTable

我们可以使用 Merge() 方法合并两个 DataTable

using System;
using System.Data;class Program
{static void Main(){DataTable table1 = new DataTable("MyTable");table1.Columns.Add("ID", typeof(int));table1.Columns.Add("Name", typeof(string));table1.Columns.Add("Age", typeof(int));DataRow row1 = table1.NewRow();row1["ID"] = 1;row1["Name"] = "Alice";row1["Age"] = 25;table1.Rows.Add(row1);DataTable table2 = new DataTable("MyTable");table2.Columns.Add("ID", typeof(int));table2.Columns.Add("Name", typeof(string));table2.Columns.Add("Age", typeof(int));DataRow row2 = table2.NewRow();row2["ID"] = 2;row2["Name"] = "Bob";row2["Age"] = 30;table2.Rows.Add(row2);// 合并 DataTabletable1.Merge(table2);// 打印合并后的行数据foreach (DataRow row in table1.Rows){Console.WriteLine($"{row["ID"]}, {row["Name"]}, {row["Age"]}");}}
}

8.克隆 DataTable

我们可以使用 Clone() 方法克隆 DataTable 的结构。

using System;
using System.Data;class Program
{static void Main(){DataTable table1 = new DataTable("MyTable");table1.Columns.Add("ID", typeof(int));table1.Columns.Add("Name", typeof(string));table1.Columns.Add("Age", typeof(int));DataRow row1 = table1.NewRow();row1["ID"] = 1;row1["Name"] = "Alice";row1["Age"] = 25;table1.Rows.Add(row1);// 克隆 DataTableDataTable table2 = table1.Clone();// 打印克隆后的表结构foreach (DataColumn column in table2.Columns){Console.WriteLine(column.ColumnName + " - " + column.DataType);}}
}

9.复制 DataTable

我们可以使用 Copy() 方法复制 DataTable 的结构和数据。

using System;
using System.Data;class Program
{static void Main(){DataTable table1 = new DataTable("MyTable");table1.Columns.Add("ID", typeof(int));table1.Columns.Add("Name", typeof(string));table1.Columns.Add("Age", typeof(int));DataRow row1 = table1.NewRow();row1["ID"] = 1;row1["Name"] = "Alice";row1["Age"] = 25;table1.Rows.Add(row1);// 复制 DataTableDataTable table2 = table1.Copy();// 打印复制后的行数据foreach (DataRow row in table2.Rows){Console.WriteLine($"{row["ID"]}, {row["Name"]}, {row["Age"]}");}}
}

10.使用 DataView 过滤和排序

DataView 是 DataTable 的一个视图,可以用于过滤和排序数据。

using System;
using System.Data;class Program
{static void Main(){DataTable table = new DataTable("MyTable");table.Columns.Add("ID", typeof(int));table.Columns.Add("Name", typeof(string));table.Columns.Add("Age", typeof(int));DataRow row1 = table.NewRow();row1["ID"] = 1;row1["Name"] = "Alice";row1["Age"] = 25;table.Rows.Add(row1);DataRow row2 = table.NewRow();row2["ID"] = 2;row2["Name"] = "Bob";row2["Age"] = 30;table.Rows.Add(row2);// 创建 DataViewDataView view = new DataView(table);view.RowFilter = "Age > 26";view.Sort = "Name DESC";// 打印过滤和排序后的行数据foreach (DataRowView rowView in view){DataRow row = rowView.Row;Console.WriteLine($"{row["ID"]}, {row["Name"]}, {row["Age"]}");}}
}

11.使用 DataTable 的事件

DataTable 提供了多个事件,如 RowChangedRowChangingRowDeletedRowDeleting 等,可以在数据发生变化时触发。

using System;
using System.Data;class Program
{static void Main(){DataTable table = new DataTable("MyTable");table.Columns.Add("ID", typeof(int));table.Columns.Add("Name", typeof(string));table.Columns.Add("Age", typeof(int));// 订阅事件table.RowChanged += new DataRowChangeEventHandler(RowChangedEvent);DataRow row1 = table.NewRow();row1["ID"] = 1;row1["Name"] = "Alice";row1["Age"] = 25;table.Rows.Add(row1);}private static void RowChangedEvent(object sender, DataRowChangeEventArgs e){Console.WriteLine($"Row changed: {e.Action}, {e.Row["Name"]}");}
}

12.使用 DataTable 的约束

我们可以为 DataTable 添加约束,如主键约束、唯一约束等。

using System;
using System.Data;class Program
{static void Main(){DataTable table = new DataTable("MyTable");table.Columns.Add("ID", typeof(int));table.Columns.Add("Name", typeof(string));table.Columns.Add("Age", typeof(int));// 添加主键约束table.PrimaryKey = new DataColumn[] { table.Columns["ID"] };// 添加唯一约束table.Columns["Name"].Unique = true;DataRow row1 = table.NewRow();row1["ID"] = 1;row1["Name"] = "Alice";row1["Age"] = 25;table.Rows.Add(row1);// 尝试添加重复主键try{DataRow row2 = table.NewRow();row2["ID"] = 1; // 重复主键row2["Name"] = "Bob";row2["Age"] = 30;table.Rows.Add(row2);}catch (Exception ex){Console.WriteLine(ex.Message);}}
}

13.使用 DataTable 的表达式列

我们可以使用表达式列来计算列的值。

using System;
using System.Data;class Program
{static void Main(){DataTable table = new DataTable("MyTable");table.Columns.Add("ID", typeof(int));table.Columns.Add("Name", typeof(string));table.Columns.Add("Age", typeof(int));// 添加表达式列table.Columns.Add("IsAdult", typeof(bool), "Age >= 18");DataRow row1 = table.NewRow();row1["ID"] = 1;row1["Name"] = "Alice";row1["Age"] = 25;table.Rows.Add(row1);DataRow row2 = table.NewRow();row2["ID"] = 2;row2["Name"] = "Bob";row2["Age"] = 16;table.Rows.Add(row2);// 打印表达式列的值foreach (DataRow row in table.Rows){Console.WriteLine($"{row["Name"]} is adult: {row["IsAdult"]}");}}
}

14.使用 DataTable 的 XML 序列化

我们可以将 DataTable 序列化为 XML,或者从 XML 反序列化为 DataTable

using System;
using System.Data;
using System.IO;class Program
{static void Main(){DataTable table = new DataTable("MyTable");table.Columns.Add("ID", typeof(int));table.Columns.Add("Name", typeof(string));table.Columns.Add("Age", typeof(int));DataRow row1 = table.NewRow();row1["ID"] = 1;row1["Name"] = "Alice";row1["Age"] = 25;table.Rows.Add(row1);// 序列化为 XMLstring xml = table.GetXml();Console.WriteLine(xml);// 将 XML 保存到文件File.WriteAllText("table.xml", xml);// 从 XML 反序列化为 DataTableDataTable newTable = new DataTable();newTable.ReadXml("table.xml");// 打印反序列化后的行数据foreach (DataRow row in newTable.Rows){Console.WriteLine($"{row["ID"]}, {row["Name"]}, {row["Age"]}");}}
}

15.使用 DataTable 的 JSON 序列化

我们可以使用 JsonConvert 类将 DataTable 序列化为 JSON,或者从 JSON 反序列化为 DataTable

using System;
using System.Data;
using Newtonsoft.Json;class Program
{static void Main(){DataTable table = new DataTable("MyTable");table.Columns.Add("ID", typeof(int));table.Columns.Add("Name", typeof(string));table.Columns.Add("Age", typeof(int));DataRow row1 = table.NewRow();row1["ID"] = 1;row1["Name"] = "Alice";row1["Age"] = 25;table.Rows.Add(row1);// 序列化为 JSONstring json = JsonConvert.SerializeObject(table);Console.WriteLine(json);// 从 JSON 反序列化为 DataTableDataTable newTable = JsonConvert.DeserializeObject<DataTable>(json);// 打印反序列化后的行数据foreach (DataRow row in newTable.Rows){Console.WriteLine($"{row["ID"]}, {row["Name"]}, {row["Age"]}");}}
}

二、总结

DataTable 是 C# 中非常强大的数据结构,适用于处理内存中的数据。通过本教程,我们应该已经掌握了 DataTable 的基本操作,包括创建、添加、修改、删除、查询、排序、合并、克隆、复制、使用 DataView、事件处理、约束、表达式列、XML 和 JSON 序列化等操作。

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

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

相关文章

RAG评估方法RAGAS的langchain实现-3

Useful Context Precision 在RAG系统评估场景下&#xff0c;“计算RAG返回有效文档的平均top-k命中率” 旨在衡量系统检索相关信息的能力&#xff0c;在只有一次查询的情况下&#xff0c;具体解释如下&#xff1a; 背后直觉&#xff1a;在实际运用RAG系统进行单次查询时&…

变化检测相关论文可读list

一些用得上的&#xff1a; 遥感变化检测常见数据集https://github.com/rsdler/Remote-Sensing-Change-Detection-Dataset/ 代码解读&#xff1a;代码解读 | 极简代码遥感语义分割&#xff0c;结合GDAL从零实现&#xff0c;以U-Net和建筑物提取为例 NeurIPS2024: https://mp.w…

从深入理解 netty——》AI

想了很久&#xff0c;准备写一个系列从深入理解 netty——》AI。 先说下为啥要从netty开始&#xff0c;看看netty的重要性 rocketmq异步消息组件nacos微服务注册中心spring cloud gateway网关redission分布式缓存es全文检索sentinel流量控制&#xff0c;服务保护seata分布式…

集成学习(一):从理论到实战(附代码)

一、引言 在机器学习领域&#xff0c;打造一个独立、强大的算法是解决问题的关键。然而&#xff0c;集成学习提供了一种不同的视角&#xff1a;通过组合多个“弱”学习器来创建一个更强大的模型。本文探讨集成学习的思想、方法及其应用。 二、机器学习 vs 集成学习思想 传统…

Auto-go 环境配置

go环境配置 1.下载 Go 安装包 从 Go 官方网站&#xff08;https://golang.org/dl/&#xff09;下载适合你操作系统的 Go 安装包。不过由于网络原因&#xff0c;可能访问官方网站不太方便可以用我这里的链接Go安装包下载地址点击自动下载 2.下载ide这里使用GoLand 官方网站 …

如何在 Elasticsearch 中设置向量搜索 - 第二部分

作者&#xff1a;来自 Elastic Valentin Crettaz 了解如何在 Elasticsearch 中设置向量搜索并执行 k-NN 搜索。 本文是三篇系列文章中的第二篇&#xff0c;深入探讨了向量搜索&#xff08;也称为语义搜索&#xff09;的复杂性以及它在 Elasticsearch 中的实现方式。 第一部分重…

Leetcode - 周赛435

目录 一、3442. 奇偶频次间的最大差值 I二、3443. K 次修改后的最大曼哈顿距离三、3444. 使数组包含目标值倍数的最少增量四、3445. 奇偶频次间的最大差值 II 一、3442. 奇偶频次间的最大差值 I 题目链接 本题使用数组统计字符串 s s s 中每个字符的出现次数&#xff0c;然后…

SQLMesh系列教程-2:SQLMesh入门项目实战(上篇)

假设你已经了解SQLMesh是什么&#xff0c;以及其他应用场景。如果没有&#xff0c;我建议你先阅读《SQLMesh系列教程-1&#xff1a;数据工程师的高效利器-SQLMesh》。 在本文中&#xff0c;我们将完成一个小项目或教程&#xff0c;以帮助你开始使用SQLMesh。你可以选择一步一步…

【xdoj-离散线上练习H】T234(C++)

解题心得&#xff1a; 写递归函数的时候&#xff0c;首先写终止条件&#xff0c;这有助于对整个递归函数的把握。 题目&#xff1a;输入集合A和B&#xff0c;输出A到B上的所有函数。 问题描述 给定非空数字集合A和B&#xff0c;求出集合A到集合B上的所有函数。 输入格式 第一行…

基础连接已经关闭: 服务器关闭了本应保持活动状态的连接

您在进行 HTTP 请求时遇到“基础连接已经关闭: 服务器关闭了本应保持活动状态的连接”的错误&#xff0c;这通常与连接的保持活动&#xff08;Keep-Alive&#xff09;设置有关。以下是可能的原因和解决方法&#xff1a; 可能的原因&#xff1a; Keep-Alive 设置&#xff1a; 默…

MybatisPlus常用增删改查

记录下MybatisPlus的简单的增删改查 接口概述 Service和Mapper区别 Mapper简化了单表的sql操作步骤&#xff08;CRUD&#xff09;&#xff0c;而Serivce则是对Mapper的功能增强。 Service虽然加入了数据库的操作&#xff0c;但还是以业务功能为主&#xff0c;而更加复杂的SQL…

17 MOS管

参考资料 全面认识MOS管&#xff0c;一篇文章就够了-云社区-华为云基础知识中 MOS 部分迟迟未整理&#xff0c;实际分享的电路中大部分常用电路都用到了MOS管&#xff0c;今天势必要来一篇文章&#xff0c;彻底掌握mos管&#xff01;https://bbs.huaweicloud.com/blogs/375339…

pnpm的使用

pnpm的使用 1.安装和使用2.统一包管理工具下载依赖 1.安装和使用 pnpm:performant npm &#xff0c;意味“高性能的npm”。 pnpm由npm/yarn衍生而来,解决了npm/yarn内部潜在的bug,极大的优化了性能,扩展了使用场景。被誉为“最先进的包管理工具”。 pnpm安装指令: npm i -g p…

World of Warcraft [CLASSIC][Grandel] FOR THE HORDE

《World of Warcraft [CLASSIC][80猎人][Grandel]维克尼拉斯大型纪录片2025年元宵节击杀联盟主城4BOSS[为了部落&#xff01;]》 World of Warcraft [CLASSIC][80猎人][Grandel]维克尼拉斯大型纪录片2025年元宵节击杀联盟主城4BOSS[为了部落&#xff01;]_魔兽

Docker 网络的几种常见类型

目录 Docker 网络类型 桥接网络&#xff08;Bridge&#xff09; 通俗解释 特点 使用场景 示例 主机网络&#xff08;Host&#xff09; 通俗解释 特点 使用场景 示例 None 网络 通俗解释 特点 使用场景 示例 Overlay 网络 通俗解释 特点 使用场景 示例 Ma…

SSH隧道+Nginx:绿色通道详解(SSH Tunnel+nginx: Green Channel Detailed Explanation)

SSH隧道Nginx&#xff1a;内网资源访问的绿色通道 问题背景 模拟生产环境&#xff0c;使用两层Nginx做反向代理&#xff0c;请求公网IP来访问内网服务器的网站。通过ssh隧道反向代理来实现&#xff0c;重点分析一下nginx反代的基础配置。 实验环境 1、启动内网服务器的tomca…

人生的转折点反而迷失了方向

就像我老婆说的&#xff0c;我是抽空结了一个婚。今天是上班的第三天&#xff0c;不知道是出于何种原因&#xff0c;自己反而陷入了深深的困境&#xff0c;没有了斗志&#xff0c;原因也找不出来&#xff0c;白天在公司没有很大量的产出&#xff0c;晚上回去是想学一学&#xf…

SQLite 数据库:优点、语法与快速入门指南

文章目录 一、引言二、SQLite 的优点 &#x1f4af;三、SQLite 的基本语法3.1 创建数据库3.2 创建表3.3 插入数据3.4 查询数据3.5 更新数据3.6 删除数据3.7 删除表 四、快速入门指南4.1 安装 SQLite4.2 创建数据库4.3 创建表4.4 插入数据4.5 查询数据4.6 更新数据4.7 删除数据4…

uniapp 编译生成鸿蒙正式app步骤

1&#xff0c;在最新版本DevEco-Studio工具新建一个空项目并生成p12和csr文件&#xff08;构建-生成私钥和证书请求文件&#xff09; 2&#xff0c;华为开发者平台 根据上面生成的csr文件新增cer和p7b文件&#xff0c;分发布和测试 3&#xff0c;在最新版本DevEco-Studio工具 文…

ADB详细教程

目录 一、ADB简介 二、配置 配置环境变量 验证是否安装成功 三、简单使用 基本命令 设备连接管理 USB连接 WIFI连接&#xff08;需要USB线&#xff09; 开启手机USB调试模式 开启USB调试 四、其他 更换ADB默认启动端口 一、ADB简介 ADB&#xff08;Android Debug…