C#中LINQtoObjects、LINQtoDataSet和LINQtoXML

news2024/11/27 18:35:43

目录

一、使用LINQ操作数组和集合

二、使用LINQ操作DataSet数据集

1.AsEnumerable()方法

2.CopyToDataTable()方法

3.AsDataView()方法

4.Take()方法

5.Sum()方法

6.示例

(1)源码

(2)生成效果

三、使用LINQ操作XML

1.XElement类的Load()方法

2.XElement类的SetAttributeValue()方法

3.XElement类的Add()方法

4.XElement类的ReplaceNodes()方法

5.XElement类的Save()方法

6.XDocument类的Save()方法

7.XDeclaration类

8.示例

(1)源码

(2)生成效果


一、使用LINQ操作数组和集合

        对数组和集合进行操作时可以使用LINQtoObjects技术(一种新的处理集合的方法)。只需编写描述要检索的内容的声明性代码。LINQtoObjects直接使用LINQ查询IEnumerable或IEnumerable<T>集合,使用LINQ能够查询任何可枚举的集合,例如数组、泛型列表等。

// LINQ to Objects
// 使用LINQ操作数组和集合

namespace _08
{
    class Program
    {
        /// <summary>
        /// 定义一个数组1
        /// 使用LINQ技术从数组中查找及格范围内的数并存储于数组2
        /// 遍历输出数组2
        /// </summary>
        static void Main(String[] args)
        {
            if (args is null)                           //解除IDE0060
            {
                throw new ArgumentNullException(nameof(args));
            }

            int[] _Scores = { 45, 68, 80, 90, 75, 76, 32 }; 
            var _Score = from High_score in _Scores
                        where High_score >= 60
                        orderby High_score ascending  
                        select High_score;

            Console.WriteLine("及格的分数:");

            foreach(var sc in _Score) { 
                Console.WriteLine(sc.ToString());
            }
            Console.ReadLine();
        }
    }
}
//运行结果:
//及格的分数:
//68
//75
//76
//80
//90

二、使用LINQ操作DataSet数据集

        对DataSet数据集进行操作时可以使用LINQtoDataSet技术(LINQ to ADO.NET中的一种独立技术),使查询DataSet对象更加方便、快捷。

        LINQtoDataSet技术中的常用方法:

1.AsEnumerable()方法

        AsEnumerable()方法可以将DataTable对象转换为EnumerableRowCollection <DataRow>对象:

public static EnumerableRowCollection<DataRow>AsEnumerable(this DataTable source)
☑ source:可枚举的源DataTable。
☑ 返回值:一个IEnumerable<T>对象,其泛型参数T为DataRow。

2.CopyToDataTable()方法

        CopyToDataTable()方法用来将IEnumerable<T>对象中的数据赋值到DataTable对象中:

public static DataTable CopyToDataTable<T>(this IEnumerable<T>source)where T:DataRow
☑ source:源IEnumerable<T>序列。
☑ 返回值:一个DataTable,其中包含作为DataRow对象的类型的输入序列。

3.AsDataView()方法

        AsDataView()方法用来创建并返回支持LINQ的DataView对象:

public static DataView AsDataView<T>(this EnumerableRowCollection<T>source)where T:DataRow 
☑ source:从中创建支持LINQ的DataView的源LINQ to DataSet查询。
☑ 返回值:支持LINQ的DataView对象

4.Take()方法

        Take()方法用来从序列的开头返回指定数量的连续元素:

public static IEnumerable<TSource>Take<TSource>(this IEnumerable<TSource>source,int count)
☑ source:要从其返回元素的序列。
☑ count:要返回的元素数量。
☑ 返回值:一个IEnumerable<T>,包含输入序列开头的指定数量的元素。

5.Sum()方法

        Sum()方法用来计算数值序列之和:

public static decimal Sum(this IEnumerable<decimal>source)
☑ source:一个要计算和的Decimal值序列。
☑ 返回值:序列值之和

        上面介绍的几种方法都有多种重载形式。

6.示例

        使用了LINQ to DataSet技术的AsEnumerable() 方法和CopyToDataTable()方法。

(1)源码

//Form1.cs
// LINQ to DataSet
// 使用LINQ操作DataSet数据集
// 使用了LINQ to DataSet技术的AsEnumerable() 方法和CopyToDataTable()方法
using System;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Windows.Forms;

namespace _09
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public string _strCon;

        /// <summary>
        /// LINQ to DataSet流程:
        /// SqlConnection实例化
        /// SqlDataAdapter实例化
        /// DataSet实例化
        /// 使用LINQ从数据集中查询所有数据
        /// 将查询结果生成DataTable,并作为dataGridView1的数据源
        /// </summary>
        private void Form1_Load(object sender, EventArgs e)
        {
            dataGridView1.Dock = DockStyle.Fill;
            _strCon = "Data Source=DESKTOP-3LV13FS;Initial Catalog=db_CSharp;Integrated Security=True";    //定义数据库连接字符串
           
            SqlConnection sqlcon = new SqlConnection(_strCon);                                                                      //实例化数据库连接对象
            SqlDataAdapter sqlda = new SqlDataAdapter("select * from tb_Salary", sqlcon);                               //实例化数据库桥接器对象
            DataSet myds = new DataSet();                                                          //实例化数据集对象
            sqlda.Fill(myds, "tb_Salary");                                                               //填充DataSet数据集
            var Query = from salary in myds.Tables["tb_Salary"].AsEnumerable()    //使用LINQ从数据集中查询所有数据
                        select salary;
            DataTable myDTable = Query.CopyToDataTable<DataRow>();           //将查询结果转化为DataTable对象
            dataGridView1.DataSource = myDTable;                                            //显示查询到的数据集中的信息
        }
    }   
}

(2)生成效果

三、使用LINQ操作XML

        对XML文件进行操作时可以使用LINQtoXML技术(LINQ技术中的一种,提供了修改文档对象模型的内存文档,并支持LINQ查询表达式等功能)。

1.XElement类的Load()方法

        Xelement类表示一个XML元素,其Load()方法用来从文件加载Xelement:

public static XElement Load(string url) 
☑ url:一个url字符串,用来引用要加载到新XElement中的文件。
☑ 返回值:一个包含指定文件内容的XElement。

2.XElement类的SetAttributeValue()方法

        SetAttributeValue()方法用来设置属性的值、添加属性或移除属性。

public void SetAttributeValue(XName name,Object value)
☑ name:一个XName,其中包含要更改的属性的名称。
☑ value:分配给属性的值。如果该值为null,则移除该属性;否则,会将值转换为其字符串表示形式,并分配给该属性的Value属性。

3.XElement类的Add()方法

        Add()方法用来将指定的内容添加为此XContainer的子级。

public void Add(Object content) 
content表示要添加的包含简单内容的对象或内容对象集合。

4.XElement类的ReplaceNodes()方法

        ReplaceNodes()方法用来使用指定的内容替换此文档或元素的子节点。

public void ReplaceNodes(Object content)
content表示一个用于替换子节点的包含简单内容的对象或内容对象集合。

5.XElement类的Save()方法

        Save()方法用来序列化此元素的基础XML树,可以将输出保存到文件、XmlTextWriter、TextWriter或XmlWriter。

public void Save(string fileName) 
fileName是一个包含文件名称的字符串。 

6.XDocument类的Save()方法

        XDocument类表示XML文档,其Save()方法用来将此XDocument序列化为文件、TextWriter或XmlWriter。

public void Save(string fileName) 
fileName是一个包含文件名称的字符串。

7.XDeclaration类

        XDeclaration类表示一个XML声明。

public XDeclaration(string version,string encoding,string standalone)
☑ version:XML的版本,通常为“1.0”。
☑ encoding:XML文档的编码。
☑ standalone:包含yes或no的字符串,用来指定XML是独立的还是需要解析外部实体。

        使用LINQtoXML技术中的类时,需要添加System.Linq.Xml命名空间。

8.示例

        使用了XElement类的Load()方法、XElement类的Add()方法、XElement类的Save()方法。使用了Xnode类的Remove()方法。

(1)源码

//Form1.cs
// LINQ to XML
// 使用LINQ操作XML
// 使用了XElement类的Load()方法、XElement类的Add()方法、XElement类的Save()方法
// 使用了Xnode类的Remove()方法
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
using System.Xml.Linq;

namespace _10
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public static string _strPath = "Employee.xml"; //文件放在DEBUG根目录
        public static string _strID = "";

        /// <summary>
        /// 初始化Form1
        /// 调用自定义方法加载XML文件
        /// </summary>
        private void Form1_Load(object sender, EventArgs e)
        {
            label1.Text = "姓名:";
            label2.Text = "薪水:";
            label3.Text = "性别:";
            button1.Text = "添加";
            button2.Text = "修改";
            button3.Text = "删除";
            groupBox1.Text = "LINQtoXML操作XML文件";
            comboBox1.Items.AddRange(new object[] { "男", "女" });

            button1.Size = new Size(40, 21);
            button2.Size = new Size(40, 21);
            button3.Size = new Size(40, 21);
            comboBox1.Size = new Size(40, 21);
            textBox1.Size = new Size(80, 21);
            textBox2.Size = new Size(60, 21);

            GetXmlInfo();   //窗体加载时加载XML文件
        }

        #region 将XML文件内容绑定到DataGridView控件
        /// <summary>
        /// 将XML文件内容绑定到DataGridView控件
        /// 定义一个数据集合并利用其ReadXml()方法绑定XML文件
        ///  dataGridView1的数据源=数据集合
        /// </summary>
        private void GetXmlInfo()
        {
            DataSet myds = new DataSet();
            myds.ReadXml(_strPath);
            dataGridView1.DataSource = myds.Tables[0];
        }
        #endregion

        /// <summary>
        /// 添加
        /// 使用了XElement类的Load()方法、XElement类的Add()方法、XElement类的Save()方法
        /// </summary>
        private void Button1_Click(object sender, EventArgs e)
        {
            XElement xe = XElement.Load(_strPath);
            IEnumerable<XElement> elements1 = from element in xe.Elements("People")
                                              select element;
            //生成新的编号
            string str = (Convert.ToInt32(elements1.Max(element => element.Attribute("ID").Value)) + 1).ToString("000");
            XElement people = new XElement(
                "People", new XAttribute("ID", str),
                new XElement("Name", textBox1.Text),
                new XElement("Sex", comboBox1.Text),
                new XElement("Salary", textBox2.Text)
                );
            xe.Add(people);
            xe.Save(_strPath);
            GetXmlInfo();
        }

        /// <summary>
        /// 修改
        /// 使用了XElement类的Load()方法、XElement类的Save()方法
        /// </summary>
        private void Button2_Click(object sender, EventArgs e)
        {
            if (_strID != "")
            {
                XElement xe = XElement.Load(_strPath);
                IEnumerable<XElement> elements = from element in xe.Elements("People")
                                                 where element.Attribute("ID").Value == _strID
                                                 select element;
                if (elements.Count() > 0)
                {
                    XElement newXE = elements.First();
                    newXE.SetAttributeValue("ID", _strID);
                    newXE.ReplaceNodes(
                        new XElement("Name", textBox1.Text),
                        new XElement("Sex", comboBox1.Text),
                        new XElement("Salary", textBox2.Text)
                        );
                }
                xe.Save(_strPath);
            }
            GetXmlInfo();
        }

        /// <summary>
        /// 删除
        /// 使用了XElement类的Load()方法、XElement类的Save()方法、Xnode类的Remove()方法
        /// </summary>
        private void Button3_Click(object sender, EventArgs e)
        {
            if (_strID != "")
            {
                XElement xe = XElement.Load(_strPath);
                IEnumerable<XElement> elements = from element in xe.Elements("People")
                                                 where element.Attribute("ID").Value == _strID
                                                 select element;
                if (elements.Count() > 0)
                    elements.First().Remove();
                xe.Save(_strPath);
            }
            GetXmlInfo();
        }

        /// <summary>
        /// 显示鼠标选中XML点的详细信息,并赋值给文本框
        /// 使用了XElement类的Load()方法
        /// </summary>
        private void DataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            _strID = dataGridView1.Rows[e.RowIndex].Cells[3].Value.ToString();
            XElement xe = XElement.Load(_strPath);
            IEnumerable<XElement> elements = from SelectedInfo in xe.Elements("People")
                                             where SelectedInfo.Attribute("ID").Value == _strID
                                             select SelectedInfo;
            foreach (XElement element in elements)
            {
                textBox1.Text = element.Element("Name").Value;               
                textBox2.Text = element.Element("Salary").Value;
                comboBox1.SelectedItem = element.Element("Sex").Value;
            }
        }
    }
}

(2)生成效果

         原表和增加、修改、删除后的表

 

 

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

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

相关文章

立创eda专业版学习笔记(8)(运行模式)

以前没注意过这个问题&#xff0c;我有2台电脑&#xff0c;都能登录eda专业版&#xff0c;但是一台是全在线模式&#xff0c;另外一台是半离线模式&#xff0c;虽然是同一个账号&#xff0c;但是打开里面的工程会发现&#xff0c;两边的工程完全不同&#xff0c;因为一台的工程…

建模与决策

&#xff08;1&#xff09; 人们老说&#xff1a;算法、建模。但其实人们口中老说的算法、建模&#xff0c;不是真正的算法、建模&#xff0c;而是逻辑。 所以我在这里&#xff0c;对建模、模型做个定义&#xff0c;那就是&#xff1a; 一定能用数学公式进行表达、推导 而且这个…

佩戴舒适好的蓝牙耳机有哪些?五款佩戴最舒适的蓝牙耳机分享

随着骨传导耳机的普及&#xff0c;越来越多的人开始了解这种新型的耳机。相较于传统耳机&#xff0c;骨传导耳机长时间佩戴不会出现耳朵疼痛等问题&#xff0c;因此成为了很多人的首选。它不需要塞入耳道&#xff0c;避免了耳朵的闷热感&#xff0c;更能有效预防耳道感染的发生…

友提:2023年小学生古诗文大会今天(11月4日)截止,请及时参赛

根据小学生古诗文大会方案和通知&#xff0c;2023第八届上海小学生古诗文大会暨古诗文“桂冠少年”选拔活动初选答题时间为10月21日开始到11月4日结束。 即到今天晚上23点59分就结束初选答题&#xff0c;请各位家长和孩子们准时参赛&#xff0c;必要的时候设置闹钟。 一、如何…

基于Python+Networkx的最短路径

networkx是一个用Python语言开发的图论与复杂网络建模工具&#xff0c;内置了常用的图与复杂网络分析算法&#xff0c;可以方便的进行复杂网络数据分析、仿真建模等工作。利用networkx可以以标准化和非标准化的数据格式存储网络、生成多种随机网络和经典网络、分析网络结构、建…

3+单细胞+代谢+WGCNA+机器学习

今天给同学们分享一篇生信文章“Identification of new co-diagnostic genes for sepsis and metabolic syndrome using single-cell data analysis and machine learning algorithms”&#xff0c;这篇文章发表Front Genet.期刊上&#xff0c;影响因子为3.7。 结果解读&#x…

xilinx fpga ddr mig axi

硬件 参考&#xff1a; https://zhuanlan.zhihu.com/p/97491454 https://blog.csdn.net/qq_22222449/article/details/106492469 https://zhuanlan.zhihu.com/p/26327347 https://zhuanlan.zhihu.com/p/582524766 包括野火、正点原子的资料 一片内存是 1Gbit 128MByte 16bit …

【教3妹学编程-算法题】数组中两个数的最大异或值

3妹&#xff1a;“太阳当空照&#xff0c;花儿对我笑&#xff0c;小鸟说早早早&#xff0c;你为什么背上炸药包” 2哥 :3妹&#xff0c;什么事呀这么开心呀。 3妹&#xff1a;2哥你看今天的天气多好啊&#xff0c;阳光明媚、万里无云、秋高气爽&#xff0c;适合秋游。 2哥&…

成人编程先学什么?成人编程一般要学几年

成人编程先学什么&#xff1f;成人编程一般要学几年 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的软件&#xff0c;向如图这个实例就是用这个…

【操作系统】多线程同步与互斥

文章目录 一. 实验目的二. 实验内容三. 实验步骤四. 实验结果五. 实验总结 一. 实验目的 &#xff08;1&#xff09;加强对进程同步和互斥的理解&#xff0c;学会使用信号量解决资源共享问题。 &#xff08;2&#xff09;熟悉Linux 进程同步原语。 &#xff08;3&#xff09;掌…

第8章_聚合函数

文章目录 1 聚合函数介绍1.1 AVG和SUM函数1.2 MIN和Max函数1.3 COUNT函数演示代码 2 GROUP BY2.1 基本使用2.2 使用多个列分组2.3 演示代码 3 HAVING3.1 基本使用3.2 WHERE和HAVING的对比3.3 演示代码 4 SELECT的执行过程4.1 查询的结构4.2 SELECT执行顺序4.3 SQL的执行原理演示…

前K个高频单词(Java详解)

一、题目描述 给定一个单词列表 words 和一个整数 k &#xff0c;返回前 k 个出现次数最多的单词。 返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率&#xff0c; 按字典顺序 排序。 示例1&#xff1a; 输入: words ["i", "love&…

curl(四)证书相关

一 证书相关 ① -k 1、客户端忽略服务端证书校验 -k | --insecure --> 单向[1]、这个选项显式地允许curl 执行不安全 的SSL连接和传输[2]、所有SSL连接都试图通过使用默认安装的CA证书捆绑包来确保安全[3]、这使得所有被认为是不安全的连接失败,除非使用-k --> 自签…

Android logd日志简介及典型案例分析

在程序开发过程中&#xff0c;日志打印属于最普遍的操作&#xff0c;是代码调试和验证过程必不可少的手段。在Android开发过程中&#xff0c;我们经常通过Log\Slog等方式写入日志&#xff0c;然后通过对应的logcat命令读取相应的日志信息。具体日志如何写入或者读出&#xff0c…

oracle查询数据库内全部的表名、列明、注释、数据类型、长度、精度等

Oracle查询数据库内全部的表名、列明、注释、数据类型、长度、精度 SELECT a.TABLE_NAME 表名, row_number() over(partition by a.TABLE_NAME order by a.COLUMN_NAME desc) 字段顺序,a.COLUMN_NAME 列名, b.COMMENTS 注释,a.DATA_TYPE 数据类型, a.DATA_LENGTH 长度,DATA_SC…

Linux高级命令(扩展)二

一、Linux下用户管理 1、用户概念以及基本作用 用户&#xff1a;指的是Linux操作系统中用于管理系统或者服务的人 一问&#xff1a;管理系统到底在管理什么&#xff1f; 答&#xff1a;Linux下一切皆文件&#xff0c;所以用户管理的是相应的文件 二问&#xff1a;如何管理…

SpringBoot集成Redis客户端

文章目录 Redis 的 Java 客户端Spring Data Redis 介绍Spring Data Redis 使用方式 Redis 的 Java 客户端 Redis 的 Java 客户端很多&#xff0c;常用的几种&#xff1a; JedisLettuceSpring Data Redis Spring Data Redis 介绍 Spring Data Redis 是 Spring 的一部分&…

跨境电商年底风控升级,测评养号如何选择稳定且纯净的IP环境?

随着年底跨境电商平台风控的升级&#xff0c;许多测评团队的账号存活率有所下降。对于自养号测评的卖家来说&#xff0c;IP的重要性不言而喻。除了设置参数阻断&#xff0c;IP的质量也直接影响到账户的稳定性和成功率。因此&#xff0c;在年底这个特殊时期&#xff0c;所有测评…

Kali Linux:网络与安全专家的终极武器

文章目录 一、Kali Linux 简介二、Kali Linux 的优势三、使用 Kali Linux 进行安全任务推荐阅读 ——《Kali Linux高级渗透测试》适读人群内容简介作者简介目录 Kali Linux&#xff1a;网络与安全专家的终极武器 Kali Linux&#xff0c;对于许多网络和安全专业人士来说&#x…

【APUE】并发 — 线程

目录 一、线程的概念 1.1 定义 1.2 POSIX 线程标准 1.3 线程标识 1.4 相关函数 1.5 一些补充 二、线程的创建、终止与取消 2.1 创建 2.2 终止 2.2.1 return 2.2.2 pthread_exit 2.3 取消 2.3.1 函数介绍 2.3.2 禁止线程被取消 2.3.3 线程取消方式 2.4 清…