• C#中LINQtoObjects、LINQtoDataSet和LINQtoXML


    目录

    一、使用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集合,使用LINQ能够查询任何可枚举的集合,例如数组、泛型列表等。

    1. // LINQ to Objects
    2. // 使用LINQ操作数组和集合
    3. namespace _08
    4. {
    5. class Program
    6. {
    7. ///
    8. /// 定义一个数组1
    9. /// 使用LINQ技术从数组中查找及格范围内的数并存储于数组2
    10. /// 遍历输出数组2
    11. ///
    12. static void Main(String[] args)
    13. {
    14. if (args is null) //解除IDE0060
    15. {
    16. throw new ArgumentNullException(nameof(args));
    17. }
    18. int[] _Scores = { 45, 68, 80, 90, 75, 76, 32 };
    19. var _Score = from High_score in _Scores
    20. where High_score >= 60
    21. orderby High_score ascending
    22. select High_score;
    23. Console.WriteLine("及格的分数:");
    24. foreach(var sc in _Score) {
    25. Console.WriteLine(sc.ToString());
    26. }
    27. Console.ReadLine();
    28. }
    29. }
    30. }
    31. //运行结果:
    32. //及格的分数:
    33. //68
    34. //75
    35. //76
    36. //80
    37. //90

    二、使用LINQ操作DataSet数据集

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

            LINQtoDataSet技术中的常用方法:

    1.AsEnumerable()方法

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

    1. public static EnumerableRowCollectionAsEnumerable(this DataTable source)
    2. ☑ source:可枚举的源DataTable。
    3. ☑ 返回值:一个IEnumerable对象,其泛型参数T为DataRow。

    2.CopyToDataTable()方法

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

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

    3.AsDataView()方法

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

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

    4.Take()方法

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

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

    5.Sum()方法

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

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

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

    6.示例

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

    (1)源码

    1. //Form1.cs
    2. // LINQ to DataSet
    3. // 使用LINQ操作DataSet数据集
    4. // 使用了LINQ to DataSet技术的AsEnumerable() 方法和CopyToDataTable()方法
    5. using System;
    6. using System.Data;
    7. using System.Data.SqlClient;
    8. using System.Linq;
    9. using System.Windows.Forms;
    10. namespace _09
    11. {
    12. public partial class Form1 : Form
    13. {
    14. public Form1()
    15. {
    16. InitializeComponent();
    17. }
    18. public string _strCon;
    19. ///
    20. /// LINQ to DataSet流程:
    21. /// SqlConnection实例化
    22. /// SqlDataAdapter实例化
    23. /// DataSet实例化
    24. /// 使用LINQ从数据集中查询所有数据
    25. /// 将查询结果生成DataTable,并作为dataGridView1的数据源
    26. ///
    27. private void Form1_Load(object sender, EventArgs e)
    28. {
    29. dataGridView1.Dock = DockStyle.Fill;
    30. _strCon = "Data Source=DESKTOP-3LV13FS;Initial Catalog=db_CSharp;Integrated Security=True"; //定义数据库连接字符串
    31. SqlConnection sqlcon = new SqlConnection(_strCon); //实例化数据库连接对象
    32. SqlDataAdapter sqlda = new SqlDataAdapter("select * from tb_Salary", sqlcon); //实例化数据库桥接器对象
    33. DataSet myds = new DataSet(); //实例化数据集对象
    34. sqlda.Fill(myds, "tb_Salary"); //填充DataSet数据集
    35. var Query = from salary in myds.Tables["tb_Salary"].AsEnumerable() //使用LINQ从数据集中查询所有数据
    36. select salary;
    37. DataTable myDTable = Query.CopyToDataTable(); //将查询结果转化为DataTable对象
    38. dataGridView1.DataSource = myDTable; //显示查询到的数据集中的信息
    39. }
    40. }
    41. }

    (2)生成效果

    三、使用LINQ操作XML

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

    1.XElement类的Load()方法

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

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

    2.XElement类的SetAttributeValue()方法

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

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

    3.XElement类的Add()方法

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

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

    4.XElement类的ReplaceNodes()方法

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

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

    5.XElement类的Save()方法

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

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

    6.XDocument类的Save()方法

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

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

    7.XDeclaration类

            XDeclaration类表示一个XML声明。

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

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

    8.示例

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

    (1)源码

    1. //Form1.cs
    2. // LINQ to XML
    3. // 使用LINQ操作XML
    4. // 使用了XElement类的Load()方法、XElement类的Add()方法、XElement类的Save()方法
    5. // 使用了Xnode类的Remove()方法
    6. using System;
    7. using System.Collections.Generic;
    8. using System.ComponentModel;
    9. using System.Data;
    10. using System.Drawing;
    11. using System.Linq;
    12. using System.Text;
    13. using System.Threading.Tasks;
    14. using System.Windows.Forms;
    15. using static System.Windows.Forms.VisualStyles.VisualStyleElement;
    16. using System.Xml.Linq;
    17. namespace _10
    18. {
    19. public partial class Form1 : Form
    20. {
    21. public Form1()
    22. {
    23. InitializeComponent();
    24. }
    25. public static string _strPath = "Employee.xml"; //文件放在DEBUG根目录
    26. public static string _strID = "";
    27. ///
    28. /// 初始化Form1
    29. /// 调用自定义方法加载XML文件
    30. ///
    31. private void Form1_Load(object sender, EventArgs e)
    32. {
    33. label1.Text = "姓名:";
    34. label2.Text = "薪水:";
    35. label3.Text = "性别:";
    36. button1.Text = "添加";
    37. button2.Text = "修改";
    38. button3.Text = "删除";
    39. groupBox1.Text = "LINQtoXML操作XML文件";
    40. comboBox1.Items.AddRange(new object[] { "男", "女" });
    41. button1.Size = new Size(40, 21);
    42. button2.Size = new Size(40, 21);
    43. button3.Size = new Size(40, 21);
    44. comboBox1.Size = new Size(40, 21);
    45. textBox1.Size = new Size(80, 21);
    46. textBox2.Size = new Size(60, 21);
    47. GetXmlInfo(); //窗体加载时加载XML文件
    48. }
    49. #region 将XML文件内容绑定到DataGridView控件
    50. ///
    51. /// 将XML文件内容绑定到DataGridView控件
    52. /// 定义一个数据集合并利用其ReadXml()方法绑定XML文件
    53. /// dataGridView1的数据源=数据集合
    54. ///
    55. private void GetXmlInfo()
    56. {
    57. DataSet myds = new DataSet();
    58. myds.ReadXml(_strPath);
    59. dataGridView1.DataSource = myds.Tables[0];
    60. }
    61. #endregion
    62. ///
    63. /// 添加
    64. /// 使用了XElement类的Load()方法、XElement类的Add()方法、XElement类的Save()方法
    65. ///
    66. private void Button1_Click(object sender, EventArgs e)
    67. {
    68. XElement xe = XElement.Load(_strPath);
    69. IEnumerable elements1 = from element in xe.Elements("People")
    70. select element;
    71. //生成新的编号
    72. string str = (Convert.ToInt32(elements1.Max(element => element.Attribute("ID").Value)) + 1).ToString("000");
    73. XElement people = new XElement(
    74. "People", new XAttribute("ID", str),
    75. new XElement("Name", textBox1.Text),
    76. new XElement("Sex", comboBox1.Text),
    77. new XElement("Salary", textBox2.Text)
    78. );
    79. xe.Add(people);
    80. xe.Save(_strPath);
    81. GetXmlInfo();
    82. }
    83. ///
    84. /// 修改
    85. /// 使用了XElement类的Load()方法、XElement类的Save()方法
    86. ///
    87. private void Button2_Click(object sender, EventArgs e)
    88. {
    89. if (_strID != "")
    90. {
    91. XElement xe = XElement.Load(_strPath);
    92. IEnumerable elements = from element in xe.Elements("People")
    93. where element.Attribute("ID").Value == _strID
    94. select element;
    95. if (elements.Count() > 0)
    96. {
    97. XElement newXE = elements.First();
    98. newXE.SetAttributeValue("ID", _strID);
    99. newXE.ReplaceNodes(
    100. new XElement("Name", textBox1.Text),
    101. new XElement("Sex", comboBox1.Text),
    102. new XElement("Salary", textBox2.Text)
    103. );
    104. }
    105. xe.Save(_strPath);
    106. }
    107. GetXmlInfo();
    108. }
    109. ///
    110. /// 删除
    111. /// 使用了XElement类的Load()方法、XElement类的Save()方法、Xnode类的Remove()方法
    112. ///
    113. private void Button3_Click(object sender, EventArgs e)
    114. {
    115. if (_strID != "")
    116. {
    117. XElement xe = XElement.Load(_strPath);
    118. IEnumerable elements = from element in xe.Elements("People")
    119. where element.Attribute("ID").Value == _strID
    120. select element;
    121. if (elements.Count() > 0)
    122. elements.First().Remove();
    123. xe.Save(_strPath);
    124. }
    125. GetXmlInfo();
    126. }
    127. ///
    128. /// 显示鼠标选中XML点的详细信息,并赋值给文本框
    129. /// 使用了XElement类的Load()方法
    130. ///
    131. private void DataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
    132. {
    133. _strID = dataGridView1.Rows[e.RowIndex].Cells[3].Value.ToString();
    134. XElement xe = XElement.Load(_strPath);
    135. IEnumerable elements = from SelectedInfo in xe.Elements("People")
    136. where SelectedInfo.Attribute("ID").Value == _strID
    137. select SelectedInfo;
    138. foreach (XElement element in elements)
    139. {
    140. textBox1.Text = element.Element("Name").Value;
    141. textBox2.Text = element.Element("Salary").Value;
    142. comboBox1.SelectedItem = element.Element("Sex").Value;
    143. }
    144. }
    145. }
    146. }

    (2)生成效果

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

     

     

  • 相关阅读:
    zabbix安装
    Oracle-day5:新增、复制建表、表结构、表数据、删除
    openstack基本命令小结
    API接口随心搭,自由定制你的数据流
    【Java入门到精通】第5讲--条件结构
    面试百问:项目上线后才发现bug怎么办?
    Linux下ElasticSearch7.9.2安装配置(包含服务器配置、启动停止脚本、开放端口和elasticsearch-head插件的使用)
    Shell编程入门--概念、特性、bash配置文件
    C++核心编程(三)
    算法查找——分块查找
  • 原文地址:https://blog.csdn.net/wenchm/article/details/134211760