一、前言
学习心得:C# 入门经典第8版书中的第22章《LINQ》
二、LINQ to XML
我们可以通过LINQ to XML来创造xml文件 如下示例,我们用LINQ to XML来创造。
<Books>
<CSharp Time="2019">
<book>C# 入门经典</book>
<book>C# 高级编程</book>
<book>C# 深入解析</book>
<book>WPF 编程宝典</book>
</CSharp>
<Java>
</Java>
</Books>
第一步引用命名空间
using System;
using System.Xml.Linq;
第二步 示例代码(两种写法)
static void Main(string[] args)
{
XDocument doc = new XDocument(
new XElement("Books", new XElement(
"Charp", new XAttribute("Time", 2019),
new XElement(new XElement("book", "C# 入门编程")),
new XElement(new XElement("book", "C# 高级编程")),
new XElement(new XElement("book", "深入解析")),
new XElement(new XElement("book", "编程宝典"))),
new XElement(new XElement("Java", " "))));
Console.WriteLine(doc);
Console.WriteLine("------分割线--------");
XDocument doc2 = new XDocument(
new XElement("Books",
new XElement("CSharp",
new XAttribute("Time", 2019),
new[] { new XElement("Book", "C# 入门编程"),
new XElement("Book", "C# 高级编程"),
new XElement("Book", "深入解析"),
new XElement("Book", "编程宝典") }
),
new XElement("Java")
)
);
Console.WriteLine(doc2);
Console.ReadLine();
}
执行效果:
三、LINQ查询语法
LINQ查询语法可以帮助我们快速的查询我们想要的数据,对集合数组都管用。
第一步引用:
using System;
using System.Linq;
第二步(示例代码)
string[] chineseStrings = {
"你好", "世界", "学习", "编程", "科技",
"创新", "发展", "梦想", "努力", "成就",
"希望", "未来", "探索", "挑战", "实现"
};
var L = from n in chineseStrings where n.Contains("习") select n;
foreach (var l in L) { Console.WriteLine(l); }
Console.ReadLine();
示例解释:LINQ 查询语法来查找
chineseStrings
数组中包含特定字符("习")的成员,并将结果存储在变量L
中。这里的from
关键字用于指定集合中的元素,where
关键字用于筛选满足特定条件的元素,select
则用于选择要返回的内容。
四、LINQ方法语法
上述代码我们可以使用扩展方法来实现同样效果。使用Where<T> 方法
举个例子:
string[] chineseStrings = {
"你好", "世界", "学习", "编程", "科技",
"创新", "发展", "梦想", "努力", "成就",
"希望", "未来", "探索", "挑战", "实现"
};
//var L = from n in chineseStrings where n.Contains("习") select n;
var L= chineseStrings.Where(n => n.Contains("习"));
foreach (var l in L) { Console.WriteLine(l); }
Console.ReadLine();
示例解释:通过chineseStrings“.”就能看见很多可以使用的扩展方法。
五、LINQ排序查询结果
orderby 子句 orderby默认排序是A-Z 但如果加入了descending 关键字则代表相反
string[] chineseStrings = {
"啊", "吧", "从", "的", "额",
"发", "就", "和", "就",
"看", "了", "吗", "你", "哦"
};
var L = from n in chineseStrings orderby n descending select n;
foreach (var l in L) { Console.WriteLine(l); }
Console.ReadLine();
当前示例:对数组进行降序排序
输出效果:哦--你--吗--了--看--就--就--和--发--额--的--从--吧--啊--。
当然您可以自定义升序排序(默认不写关键字就是升序)
string[] chineseStrings = {
"啊", "吧啊", "从啊啊", "的啊啊啊", "额啊啊啊啊",
"发啊啊啊啊啊"
};
var L = from n in chineseStrings orderby n.Length select n;
foreach (var l in L) { Console.WriteLine(l); }
Console.ReadLine();
执行效果:
六、聚合运算符
聚合函数是指用于对一组数据执行计算,并返回单个结果的函数。这些函数通常用于对数据集合进行汇总、计数、平均值、最大值、最小值等操作。LINQ(Language Integrated Query)是 C# 中处理集合的强大工具之一,它提供了一系列的聚合函数可以应用在查询中。
using System;
using System.Linq;
namespace My
{
class Program
{
static void Main(string[] args)
{
int[] fiftyElementArray = new int[50] {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50
};
Console.WriteLine($"数组元素个数{fiftyElementArray.Count()}");
Console.WriteLine($"平均值{fiftyElementArray.Average()}");
Console.WriteLine($"最小值{fiftyElementArray.Min()}");
Console.WriteLine($"最大值{fiftyElementArray.Max()}");
Console.WriteLine($"总和{fiftyElementArray.Sum()}");
Console.ReadLine();
}
}
}
示例解释:
创建了一个包含 1 到 50 的整数数组,并使用 LINQ 的聚合函数计算了各种统计信息。当你运行这段代码时,它会输出数组的元素个数、平均值、最小值、最大值和总和。
七、单值选择查询
单值查询顾名思义就是返回结果不返回重复的值。
举个例子:
using System;
using System.Linq;
namespace My
{
class Program
{
static void Main()
{
Student[] students = {
new Student { ClassID = 10, Name = "张三" },
new Student { ClassID = 10, Name = "李四" },
new Student { ClassID = 11, Name = "王五" },
new Student { ClassID = 11, Name = "赵六" },
new Student { ClassID = 12, Name = "钱七" }
};
var student = (from m in students select m.ClassID).Distinct();
foreach (var item in student)
{
Console.WriteLine(item);
}
Console.ReadLine();
}
class Student
{
public string Name { get; set; }
public int ClassID { get; set; }
}
}
}
示例解释:
使用 LINQ 查询语法从学生数组中选择每个学生的
ClassID
属性,并使用Distinct()
方法获取不重复的ClassID
值,然后在控制台输出这些值。Distinct()
方法是 LINQ 提供的一个方法,用于在序列中筛选出不重复的元素,即返回序列中唯一的元素。当然您也可以使用扩展方法Select 。举个例子:var student = students.Select(m=> m.ClassID).Distinct();
八、多级排序
多级排序指的是按照多个条件进行排序。通过LINQ查询表达式和orderby
关键字可以轻松实现多级排序
举个例子:
using System;
using System.Collections.Generic;
using System.Linq;
namespace My
{
class Program
{
static void Main()
{
List<Person> people = new List<Person>
{
new Person("Alice", 25),
new Person("Bob", 30),
new Person("Charlie", 35),
new Person("David", 40),
new Person("Eve", 45)
};
//按年龄排序后按姓名长度降序排序
var LL= from o in people orderby o.Age orderby o.Name.Length descending select o;
foreach(Person o in LL)
{
Console.WriteLine(o.Name);
}
Console.ReadLine();
}
}
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
}
}
示例解释:
使用LINQ进行多级排序的示例。我创建了一个
List<Person>
对象,并使用LINQ进行排序操作。首先按照年龄升序排序,然后在年龄相同时按照姓名长度降序排序。最后,使用循环遍历排序后的结果,并输出每个人的姓名。
九、分组查询
using System.Collections.Generic;
using System.Linq;
namespace My
{
class Program
{
static void Main()
{
List<Student> students = new List<Student>
{
new Student { Name = "Alice", Age = 18 },
new Student { Name = "Bob", Age = 20 },
new Student { Name = "Charlie", Age = 18 },
new Student { Name = "David", Age = 19 },
new Student { Name = "Eve", Age = 20 },
new Student { Name = "Eve", Age = 40 }
};
//按照名称分组
// var temp = from student in students group student by student.Name;
//按照年龄对学生进行分组,并按照分组后的平均年龄进行排序。
var temp2 =
from student in students
group student by student.Age into AGe
select new { AvgAge = AGe.Average(n => n.Age), AGe.Key };
var temp3 = from student in temp2 orderby student.AvgAge select student;
}
}
class Student
{
public string Name { get; set; }
public int Age { get; set; }
}
}
示例解释:
当前代码 temp2 这段赋值代码的意思是,LINQ对students数组进行操作,group student 是对当前对象进行分组操作 by student.Age 对当前student.Age 的值来进行分组 into AGe 是返回一个新的结果集,然后对这个新的结果集 创建了一个匿名对象new { AvgAge = AGe.Average(n => n.Age), AGe.Key };我们之前的写法都是返回当前的结果集,但我们这里创建了一个匿名对象 对象中有两个值 一个值是计算当前结果集的平均值n => n.Age是值具体计算的平均值成员,然后赋值给匿名类型AvgAge ,这个匿名对象的第一个值,第二个值是当前的键,也就是可以理解为分组的的组名,最后返回给Temp2。temp3 则是对temp2的结果中的平均值进行一个升序排序。
数据最后效果:
十、Join查询
可以用一个查询将两个集合当中的相同数据 用关键字进行连接。
举个例子:
using System;
using System.Collections.Generic;
using System.Linq;
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
class Person2
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main(string[] args)
{
List<Person> people = new List<Person>
{
new Person { Name = "张三", Age = 30 },
new Person { Name = "李四", Age = 25 },
new Person { Name = "老六", Age = 35 }
};
List<Person2> people2 = new List<Person2>
{
new Person2 { Name = "张三三", Age = 30 },
new Person2 { Name = "李四四", Age = 25 },
new Person2 { Name = "老六六", Age = 35 }
};
var Temp = from p in people join o in people2 on p.Age equals o.Age select new { BigName = p.Name, SmallName = o.Name, p.Age };
foreach (var result in Temp)
{
Console.WriteLine(result);
}
Console.ReadLine();
}
}
示例解释:
使用LINQ查询语法进行连接操作,并选择一些属性进行输出。
var Temp = from p in people join o in people2 on p.Age equals o.Age select new { BigName = p.Name, SmallName = o.Name, p.Age };
在
people
和pets
这两个对象列表之间,通过比较Person
类的Age
属性和Pet
类的Age
属性,找到相等的项,并将Person
类的Name
属性、Pet
类的Name
属性以及Person
类的Age
属性作为结果进行输出。
执行效果: