全面分析c# LINQ攻略
什么是LINQ
LINQ代表语言集成查询。这是一个功能强大的.NET框架的一部分,允许我们使用一种声明性的方式查询各种数据源,例如SQL Server数据库,XML文档,本地集合,等等。 在C#中,我们可以使用LINQ查询编写任何类型生成器,List,Enumerable,Array或各种实体框架集合。
LINQ有什么优点
- LINQ允许我们编写与数据源无关的查询
- 只需一个标准化语言就可以查询任何数据源
- 支持强类型查询,这意味着任何类型错误都在编译时发现
- LINQ代码可读性很高,易于维护
如何使用LINQ
查询语法
查询语法可以与SQL查询相似,根据查询的需求有不同的操作符。
以下是一个示例,它显示如何使用Linq查询从一组数字中选择所有奇数:
var numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var oddNumbers = from num in numbers
where num % 2 == 1
select num;
foreach (var oddNum in oddNumbers)
{
Console.WriteLine(oddNum);
}
方法语法
另一种在Linq查询中使用的语法是方法语法。 与查询语法不同,方法语法更接近于典型的函数式编程语言。
以下是相同的示例,但是是使用方法语法编写的:
var numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var oddNumbers = numbers.Where(num => num % 2 == 1);
foreach (var oddNum in oddNumbers)
{
Console.WriteLine(oddNum);
}
LINQ的操作符
LINQ提供了各种各样的操作符,它们可以用于各种查询需求。以下是一些常见操作符的列表:
- Select
- Where
- OrderBy / OrderByDescending
- Join / GroupJoin
- Take / Skip
- First / FirstOrDefault
- Single / SingleOrDefault
- Count / Sum / Min / Max / Average
- All / Any / Contains
Select
Select
操作符通常用于在源序列的每个元素上执行一个转换。 它返回具有转换结果的新序列。
以下是一个示例,它选择一组数字并对它们进行平方:
var numbers = new int[] { 1, 2, 3, 4, 5 };
var squaredNumbers = numbers.Select(num => num * num);
foreach (var squaredNum in squaredNumbers)
{
Console.WriteLine(squaredNum);
}
Where
Where
操作符基于一个谓词函数,从源序列中选择满足指定条件的元素。
以下是一个示例,它选择一组数字中的所有奇数:
var numbers = new int[] { 1, 2, 3, 4, 5 };
var oddNumbers = numbers.Where(num => num % 2 == 1);
foreach (var oddNum in oddNumbers)
{
Console.WriteLine(oddNum);
}
OrderBy / OrderByDescending
OrderBy
或OrderByDescending
操作符根据指定的键升序或降序排列源序列的元素。
以下是一个示例,它对一组字符串按字母顺序进行排序:
var words = new string[] { "banana", "cherry", "apple" };
var sortedWords = words.OrderBy(word => word);
foreach (var word in sortedWords)
{
Console.WriteLine(word);
}
Join / GroupJoin
Join
和GroupJoin
操作符允许我们将两个序列中的元素相匹配,然后返回一个具有相应元素对的新序列。
以下是一个示例,它连接两组订单和客户并返回一组具有订单和客户信息的新对象:
var customers = new[]
{
new { Id = 1, Name = "Alice" },
new { Id = 2, Name = "Bob" },
new { Id = 3, Name = "Charlie" }
};
var orders = new[]
{
new { CustomerId = 1, OrderId = 1 },
new { CustomerId = 2, OrderId = 2 },
new { CustomerId = 1, OrderId = 3 },
new { CustomerId = 1, OrderId = 4 },
new { CustomerId = 3, OrderId = 5 }
};
var query = from customer in customers
join order in orders
on customer.Id equals order.CustomerId
select new { CustomerName = customer.Name, OrderId = order.OrderId };
foreach (var item in query)
{
Console.WriteLine($"Customer: {item.CustomerName}, OrderId: {item.OrderId}");
}
Take / Skip
Take
和Skip
操作符用于选择序列中的元素,并跳过前面的元素。
以下是一个示例,它选择第一对三个值:
var numbers = new int[] { 1, 2, 3, 4, 5 };
var firstThreeNumbers = numbers.Take(3);
foreach (var num in firstThreeNumbers)
{
Console.WriteLine(num);
}
First / FirstOrDefault
First
或FirstOrDefault
操作符返回序列中的第一个元素。
以下是一个示例,如果序列为空,FirstOrDefault
方法将返回默认值0
:
var numbers = new int[] { 1, 2, 3, 4, 5 };
var firstNumber = numbers.FirstOrDefault();
Console.WriteLine(firstNumber); //输出1
var emptyNumbers = new int[] { };
var firstEmptyNumber = emptyNumbers.FirstOrDefault();
Console.WriteLine(firstEmptyNumber); //输出0
Single / SingleOrDefault
Single
或SingleOrDefault
操作符返回序列中的单个元素。 如果序列为空或包含多个元素,则会引发异常。
以下是一个示例,它选择序列中的唯一一个奇数(如果存在):
var numbers = new int[] { 2, 4, 6, 7, 8 };
var oddNumber = numbers.SingleOrDefault(num => num % 2 == 1);
Console.WriteLine(oddNumber); //输出7
var multipleOddNumbers = new int[] { 1, 3, 5, 7 };
var multipleOddNumber = multipleOddNumbers.SingleOrDefault(num => num % 2 == 1); //抛出System.InvalidOperationException异常
Count / Sum / Min / Max / Average
这些操作符用于计算序列中的元素的聚合值。
以下是一个示例,它计算一组数字的平均值:
var numbers = new int[] { 1, 2, 3, 4, 5 };
var average = numbers.Average();
Console.WriteLine(average); //输出3
All / Any / Contains
All
和Any
操作符用于判断序列是否包含满足特定条件的元素。 Contains
操作符用于判断序列中是否存在指定的元素。
以下是一个示例,它检查一组整数是否全部为偶数:
var numbers = new int[] { 2, 4, 6, 8 };
var allEven = numbers.All(num => num % 2 == 0);
Console.WriteLine(allEven); //输出True
总结
上述是Linq的一些基础语法和操作符,但LINQ提供的丰富操作远远不止于此。如果想了解更多,请查看LINQ官方文档或扩展阅读。
示例
以下示例演示了如何使用LINQ从XML文件中检索数据。 XML文件包含一些商店名称以及它们的电话号码:
class Program
{
static void Main(string[] args)
{
XDocument xmlDoc = XDocument.Load(@"C:\shops.xml");
IEnumerable<XElement> shopsList =
from shops in xmlDoc.Descendants("Shops")
from shop in shops.Descendants("Shop")
select shop;
foreach (XElement shopElement in shopsList)
{
Console.WriteLine($"Shop name: {shopElement.Attribute("Name")}");
Console.WriteLine($"Phone number: {shopElement.Element("PhoneNumber")}");
Console.WriteLine();
}
}
}
假设XML文件如下:
<?xml version="1.0" encoding="utf-8"?>
<Shops>
<Shop Name="Shop1">
<PhoneNumber>111-1111-1111</PhoneNumber>
</Shop>
<Shop Name="Shop2">
<PhoneNumber>222-2222-2222</PhoneNumber>
</Shop>
<Shop Name="Shop3">
<PhoneNumber>333-3333-3333</PhoneNumber>
</Shop>
</Shops>
此示例将输出以下内容:
Shop name: Shop1
Phone number: 111-1111-1111
Shop name: Shop2
Phone number: 222-2222-2222
Shop name: Shop3
Phone number: 333-3333-3333
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:全面分析c# LINQ - Python技术站