本文小编为大家详细介绍“LINQ是什么及怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“LINQ是什么及怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
要理解为什么使用LINQ,先来看下面一个例子。假设有一个整数类型的数组,找到里面的偶数并进行降序排序。
在C#2.0以前,如果要实现这样的功能,我们必须使用'foreach'或'for'循环来遍历数组,先找到偶数然后在降序排序,相关代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LinqOfSelectOperation { class Program { static void Main(string[] args) { // 查询出数组中的偶数并排序 int[] ints = { 5, 2, 0, 66, 4, 32, 7, 1 }; // 定义一个整数类型的集合,用来存放数组中的偶数 List<int> list = new List<int>(); // 遍历数组查询出偶数放到集合中 foreach (int i in ints) { // 如果是偶数,把偶数加入到集合中 if (i % 2 == 0) { list.Add(i); } } // 正序排序 list.Sort(); // 反转 list.Reverse(); // 输出 Console.WriteLine(string.Join(",",list)); Console.ReadKey(); } } }
使用for循环很麻烦,而且不可维护和可读。C#2.0引入了delegate,可以使用委托来处理这种场景,代码如下图所示:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LinqOfSelectOperation { // 定义委托 delegate bool FindEven(int item); class IntExtension { public static int[] where(int[] array, FindEven dele) { int[] result=new int[5]; int i = 0; foreach (int item in array) { if (dele(item)) { result[i]=item; i++; } } return result; } } class Program { static void Main(string[] args) { // 查询出数组中的偶数并排序 int[] ints = { 5, 2, 0, 66, 4, 32, 7, 1 }; //delegate(int item){return item % 2 == 0;}表示委托的实现 List<int> list = IntExtension.where(ints, delegate(int item) { return item % 2 == 0; }).ToList(); // 正序排序 list.Sort(); // 反转 list.Reverse(); // 输出 Console.WriteLine(string.Join(",", list)); Console.ReadKey(); } } }
所以,有了C#2.0,通过使用委托有了代理的优势,不必使用for循环来查询不同条件的数组。例如你可以使用相同的委托来查找数组中的奇数,并降序排序输出,代码如下图所示:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LinqOfSelectOperation { // 定义委托 delegate bool FindEven(int item); class IntExtension { public static int[] where(int[] array, FindEven dele) { int[] result=new int[3]; int i = 0; foreach (int item in array) { if (dele(item)) { result[i]=item; i++; } } return result; } } class Program { static void Main(string[] args) { // 查询出数组中的奇数并排序 int[] ints = { 5, 2, 0, 66, 4, 32, 7, 1 }; //delegate(int item){return item % 2 != 0;}表示委托的实现 List<int> list = IntExtension.where(ints, delegate(int item) { return item % 2 != 0; }).ToList(); // 正序排序 list.Sort(); // 反转 list.Reverse(); // 输出 Console.WriteLine(string.Join(",", list)); Console.ReadKey(); } } }
虽然使用delegate可以使程序的可读性增加了,但是C#团队认为他们仍然需要使代码更加紧凑和可读,所以他们在C#3.0中引入了扩展方法、Lambda表达式、匿名类型等新特性,你可以使用C#3.0的这些新特性,这些新特性的使用LINQ的前提,可以用来查询不同类型的集合,并返回需要的结果。
下面的示例演示了如何使用LINQ和Lambda表达式根据特定条件来查询数组,示例代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LinqOfSelectOperation { class Program { static void Main(string[] args) { // 查询出数组中的奇数并排序 int[] ints = { 5, 2, 0, 66, 4, 32, 7, 1 }; // 使用LINQ和Lambda表达式查询数组中的偶数 int[] intEvens= ints.Where(p => p % 2 == 0).ToArray(); // 使用LINQ和Lambda表达式查询数组中的奇数 int[] intOdds = ints.Where(p => p % 2 != 0).ToArray(); // 输出 Console.WriteLine("偶数:" + string.Join(",", intEvens)); Console.WriteLine("奇数:" + string.Join(",", intOdds)); Console.ReadKey(); } } }
在上面的例子中可以看到,我们在单个语句中使用LINQ和Lambda表达式指定不同的查询条件,因此,LINQ使代码更加紧凑和可读,并且它也可以用于查询不同的数据源。看到这里的时候,你可能会问:究竟什么是LINQ呢?下面将会具体讲解什么是LINQ。
长期以来,开发社区形成以下的格局:
C#中字符串用string数据类型表示。
SQL中字符串用NVarchar/Varchar/Char数据类型表示。
没有智能感知效果。
没有严格意义上的强类型和类型检查。
上面描述的问题,都可以使用LINQ解决,那么究竟什么是LINQ呢?
LINQ(Language Integrated Query)即语言集成查询。
LINQ是一组语言特性和API,使得你可以使用统一的方式编写各种查询。用于保存和检索来自不同数据源的数据,从而消除了编程语言和数据库之间的不匹配,以及为不同类型的数据源提供单个查询接口。
LINQ总是使用对象,因此你可以使用相同的查询语法来查询和转换XML、对象集合、SQL数据库、ADO.NET数据集以及任何其他可用的LINQ提供程序格式的数据。
LINQ主要包含以下三部分:
1、LINQ to Objects 主要负责对象的查询。
2、LINQ to XML 主要负责XML的查询。
3、LINQ to ADO.NET 主要负责数据库的查询。
LINQ to SQL
LINQ to DataSet
LINQ to Entities
1、熟悉的语言:开发人员不必为每种类型的数据源或数据格式学习新的语言。
2、更少的编码:相比较传统的方式,LINQ减少了要编写的代码量。
3、可读性强:LINQ增加了代码的可读性,因此其他开发人员可以很轻松地理解和维护。
4、标准化的查询方式:可以使用相同的LINQ语法查询多个数据源。
5、类型检查:程序会在编译的时候提供类型检查。
6、智能感知提示:LINQ为通用集合提供智能感知提示。
7、整形数据:LINQ可以检索不同形状的数据。
读到这里,这篇“LINQ是什么及怎么使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。