欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LINQ操作其他数据

程序员文章站 2022-04-15 14:13:04
...

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

    使用的是LINQ to Object技术(一种新的处理集合的方法)

    举个栗子:

    int[ ] intScores={45,68,80,90,75,76,32};

    //使用LINQ技术从数组中查找及格范围内的分数

    var score=from hgScore in intScores

                    where hgScore>=60

                    orderby hgScore ascending

                    select hgScore;

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

    foreach(var v in score)

    {

        Console.WriteLine(v.ToString());

    }

    Console.ReadLine();

    到这儿,我突然感受到了LINQ to Object的好处,我们再也不用写那么多的嵌套循环来比较,查找一些符合范围的数字了。

    LINQ能够查询任何可枚举的集合,例如数组,泛型集合

二:使用LINQ操作DataSet数据集

    使用的是LINQ to DataSet技术

    几个常用的方法:

    1.AsEnumerable方法   将DataTable对象转换为EnumerableRowCollection<DataRow>对象

        public static EnumerableRowCollection<DataRow>AsEnumerable(this DataTable source)

        source:可以枚举的源DataTable

        返回值:一个IEnumerable<T>对象,其泛型参数T为DataRow

    2.CopyToDataTable方法   将IEnumerable<T>对象中的数据赋值到DataTable对象中

        public static DataTable CopyToDataTable<T>(this IEnumerable<T> source) where T:DataRow

        source:源IEnumerable<T>序列

        返回值:一个DataTable,其中包含DataRow对象的类型的输入序列

     3.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方法   从序列的开头返回指定数量的连续元素

        public static IEnumerable<TSource> Take<TSource>(this IEnumerable<TSource>source,int count)

        source:要从其返回元素的序列

        count:要返回的元素的数量

        返回值:一个IEnumerable<T>,包含输入序列开头的指定数量的元素

    5.Sum方法  计算数值序列之和

        public static decimal Sum(this IEnumerable<decimal> source)

        source:一个要计算和的Decimal

        返回值:序列值之和

    举个栗子:

    在将数据库中的数据查询出来填充到DataSet中后,我们可以用LINQ查询DataSet中的数据,然后将结果转换为DataTable

    ds:DataSet实例对象

    //使用LINQ从数据集中查询所有数据

    var query=from salary in ds.Tables["tb_Salary"].AsEnumerable()

                    select salary;

    //将查询结果转换为DataTable对象

    DataTable myDataTable=query.CopyToDataTable<DataRow>();

    //设置数据源

    dataGridView1.DataSource=myDataTable;

三:使用LINQ操作XML

    使用LINQ to XML技术

    1.XElement类的Load方法    Xelement类表示一个XML元素,其Load方法用来从文件加载Xelement

        public static XElement Load(string uri)

        uri:一个URI字符串,用来引用加载到新XElement中的文件

        返回值:一个包含指定文件内容的XElement

    2.XElement类的SetAttributeValue方法  SetAttributeValue方法用来设置属性值,添加属性或移除属性

        public void SetAttributeValue(XName name,Object value)

        name:一个XName,其中包含要更改的属性的名称

        value:分配给属性的值。如果该值为null,则移除该属性;否则,会将值转换为其字符串表示形式,并分配给该属性的Value

        属性

    3.XElement类的Add方法   将指定内容添加为此XContainer的子级

        public void Add(Object content)

        content:表示要添加的包含简单内容的对象或内容对象的集合

    4.XElement 类的ReplaceNodes方法    使指定的内容替换为此文档或元素的子节点

        public void ReplaceNodes(Object content)

        content:表示一个用于替换子节点的包含简单内容的对象或内容对象集合

    5.XElement类的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的版本,通常为0

        encoding:XML文档编码

        standalone:包含yes或者no的字符串,用来指定XML是独立的还是需要解析外部实体

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

    举个栗子:  将XML文档中的数据读取出来并设置为了DataGridView的数据源

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 System.Xml.Linq;

namespace LinqToXml
{
    public partial class Form1 : Form
    {
        static string strPath = "xxx.xml";
        static string strID = "";
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            getXmlInfo();  //窗体加载时加载XML文件
        }
        private void getXmlInfo()
        {
            DataSet myds = new DataSet();
            myds.ReadXml(strPath);              //读取XML结构
            dataGridView1.DataSource = myds.Tables[0];//设置dataGridView1中显示XML文件中的信息
        }
        //点击添加按钮,向xml文件中添加数据
        private void button1_Click(object sender, EventArgs e)
        {
            XElement xe = XElement.Load(strPath);   //加载XML文档
            //创建IEnumerable泛型接口
            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", "张三"),
                    new XElement("Sex", "男")
            );
            xe.Add(people);     //添加XML元素
            xe.Save(strPath);
        }
    }
}

注意:xml文件需要有根元素<root></root>,如果没有的话会报异常

在记事本中是这样的:

LINQ操作其他数据

运行结果:

LINQ操作其他数据

刚才是向XML文档插入数据,还有用LINQ to XML技术从XML文档查询

举个栗子:

点击DataGridView单元格时显示某条详细信息:

strID=dataGridView1.Rows[e.RowIndex].Cells[3].Value.ToString();    //记录选中的ID编号

XElement xe=XElement.Load(strPath);                                            //加载XML文档

IEnumerable<XElement>elements=from PInfo in xe.Elements("People")

                                                        where PInfo.Attribute("ID").Value==strID

                                                        select PInfo;

foreach(XElement element in elements)     //遍历查找的所有信息

{

    textBox1.Text=element.Element("Name").Value;  //显示员工姓名

    textBox2.Text=element.Element("Sex").Value

}

接下来是修改XML文档

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);   //为XML元素设置属性值

    newXE.ReplaceNodes(

        new XElement("Name","姓名字"),

        new XElement("Sex","新性别")

    );    

xe.Save(strPath);   //保存XML元素到文档

最终就是删除了:

关键代码:

if(elements.Count()>0)

    elements.First().Remove();

xe.Save(strPath);