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,一经查实,立即删除!

相关文章

变化检测相关论文可读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分布式…

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。你可以选择一步一步…

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;]_魔兽

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

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

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…

CNN-BiLSTM卷积神经网络双向长短期记忆神经网络多变量多步预测,光伏功率预测

代码地址&#xff1a;CNN-BiLSTM卷积神经网络双向长短期记忆神经网络多变量多步预测&#xff0c;光伏功率预测 CNN-BiLSTM卷积神经网络双向长短期记忆神经网络多变量多步预测 一、引言 1.1、研究背景和意义 光伏功率预测在现代电力系统中占有至关重要的地位。随着可再生能源…

三、OSG学习笔记-应用基础

前一章节&#xff1a;二、OSG学习笔记-入门开发-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/145513874 一、 OsgGA: 界面事件处理空间&#xff0c;处理操作各种操作器的最大名字空间&#xff1b; GUIEventHandler: ui 事件操作类 注意&#xff1a;在启…

Django开发入门 – 0.Django基本介绍

Django开发入门 – 0.Django基本介绍 A Brief Introduction to django By JacksonML 1. Django简介 1) 什么是Django? 依据其官网的一段解释&#xff1a; Django is a high-level Python web framework that encourages rapid development and clean, pragmatic design. …

计算机毕业设计PySpark+Hadoop+Hive机票预测 飞机票航班数据分析可视化大屏 航班预测系统 机票爬虫 飞机票推荐系统 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

【车载项目】 systemui下拉负一屏界面,通过语音输入:“中文模式/英文模式“,会闪现一下负一屏下层的画面

1、背景 【操作步骤】负一屏界面&#xff0c;语音输入&#xff1a;“中文模式/英文模式” 【预期结果】显示正常 【实际结果】 会闪现一下负一屏下层的文字 【发生概率】必现 systemui下拉负一屏界面&#xff0c;通过语音输入&#xff1a;“中文模式/英文模式”&#xff0c;会…

从零到一:基于Rook构建云原生Ceph存储的全面指南(上)

文章目录 一.Rook简介二.Rook与Ceph架构2.1 Rook结构体系2.2 Rook包含组件1&#xff09;Rook Operator2&#xff09;Rook Discover3&#xff09;Rook Agent 2.3 Rook与kubernetes结合的架构图如下2.4 ceph特点2.5 ceph架构2.6 ceph组件 三.Rook部署Ceph集群3.1 部署条件3.3 获取…