LINQ操作其他数据
一:使用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>,如果没有的话会报异常
在记事本中是这样的:
运行结果:
刚才是向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);