转:LINQ教程一:LINQ简介
原文地址:https://www.cnblogs.com/dotnet261010/p/8278793.html
一、为什么要使用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 = { , , , , , , , };
// 定义一个整数类型的集合,用来存放数组中的偶数
List<int> list = new List<int>();
// 遍历数组查询出偶数放到集合中
foreach (int i in ints)
{
// 如果是偶数,把偶数加入到集合中
if (i % == )
{
list.Add(i);
}
} // 正序排序
list.Sort();
// 反转
list.Reverse();
// 输出
Console.WriteLine(string.Join(",",list)); Console.ReadKey();
}
}
}
2.使用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[];
int i = ;
foreach (int item in array)
{
if (dele(item))
{
result[i]=item;
i++;
}
} return result;
}
}
class Program
{
static void Main(string[] args)
{
// 查询出数组中的偶数并排序
int[] ints = { , , , , , , , }; //delegate(int item){return item % 2 == 0;}表示委托的实现
List<int> list = IntExtension.where(ints, delegate(int item)
{
return item % == ;
}).ToList();
// 正序排序
list.Sort();
// 反转
list.Reverse();
// 输出
Console.WriteLine(string.Join(",", list)); Console.ReadKey();
}
}
}
所以,有了C#2.0,通过使用委托有了代理的优势,不必使用for循环来查询不同条件的数组。例如你可以使用相同的委托来查找数组中的奇数,并降序排序输出,代码如下图所示:
1using 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[];
int i = ;
foreach (int item in array)
{
if (dele(item))
{
result[i]=item;
i++;
}
} return result;
}
}
class Program
{
static void Main(string[] args)
{
// 查询出数组中的奇数并排序
int[] ints = { , , , , , , , }; //delegate(int item){return item % 2 != 0;}表示委托的实现
List<int> list = IntExtension.where(ints, delegate(int item)
{
return item % != ;
}).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 = { , , , , , , , }; // 使用LINQ和Lambda表达式查询数组中的偶数
int[] intEvens= ints.Where(p => p % == ).ToArray();
// 使用LINQ和Lambda表达式查询数组中的奇数
int[] intOdds = ints.Where(p => p % != ).ToArray(); // 输出
Console.WriteLine("偶数:" + string.Join(",", intEvens));
Console.WriteLine("奇数:" + string.Join(",", intOdds)); Console.ReadKey();
}
}
}
在上面的例子中可以看到,我们在单个语句中使用LINQ和Lambda表达式指定不同的查询条件,因此,LINQ使代码更加紧凑和可读,并且它也可以用于查询不同的数据源。看到这里的时候,你可能会问:究竟什么是LINQ呢?下面将会具体讲解什么是LINQ。
二、什么是LINQ
长期以来,开发社区形成以下的格局:
1、面向对象与数据访问两个领域长期分裂,各自为政。
2、编程语言中的数据类型与数据库中的数据类型形成两套不同的体系,例如:
C#中字符串用string数据类型表示。
SQL中字符串用NVarchar/Varchar/Char数据类型表示。
3、SQL编码体验落后
没有智能感知效果。
没有严格意义上的强类型和类型检查。
4、SQL和XML都有各自的查询语言,而对象没有自己的查询语言。
上面描述的问题,都可以使用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
三、LINQ的优势
1、熟悉的语言:开发人员不必为每种类型的数据源或数据格式学习新的语言。
2、更少的编码:相比较传统的方式,LINQ减少了要编写的代码量。
3、可读性强:LINQ增加了代码的可读性,因此其他开发人员可以很轻松地理解和维护。
4、标准化的查询方式:可以使用相同的LINQ语法查询多个数据源。
5、类型检查:程序会在编译的时候提供类型检查。
6、智能感知提示:LINQ为通用集合提供智能感知提示。
7、整形数据:LINQ可以检索不同形状的数据。
转:LINQ教程一:LINQ简介的更多相关文章
- LINQ教程一:LINQ简介
一.为什么要使用LINQ 要理解为什么使用LINQ,先来看下面一个例子.假设有一个整数类型的数组,找到里面的偶数并进行降序排序. 在C#2.0以前,如果要实现这样的功能,我们必须使用'foreach' ...
- 【学习总结】Git学习-参考廖雪峰老师教程一-Git简介
学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...
- WebSockets Tutorial(教程一)WebSockets简介
一.WebSockets简介 以字面意思来说,握手可以被定义为两个人抓住和握手右手,象征着问候,祝贺,同意或告别.在计算机科学中,握手是确保服务器与客户端同步的过程.握手是Web Socket协议的基 ...
- Java入门教程一(Java简介)
什么是Java语言 Java 是由 Sun Microsystems 公司于 1995 年推出的一门面向对象程序设计语言.2010 年 Oracle 公司收购 Sun Microsystems,之后由 ...
- Cobalt Strike使用教程一
Cobalt Strike使用教程一 0x00 简介 Cobalt Strike是一款基于java的渗透测试神器,常被业界人称为CS神器.自3.0以后已经不在使用Metasploit框架而作为 ...
- 从LINQ开始之LINQ to Objects(下)
前言 上一篇<从LINQ开始之LINQ to Objects(上)>主要介绍了LINQ的体系结构.基本语法以及LINQ to Objects中标准查询操作符的使用方法. 本篇则主要讨论LI ...
- CRL快速开发框架系列教程一(Code First数据表不需再关心)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- LINQ系列:Linq to Object量词操作符
量词操作符返回一个Boolean值,指示序列中是否存在部分或全部元素符号指定条件.LINQ中量词操作符包括:All.Any和Contains. 1. All All操作符判定在集合中是否所有的值都满足 ...
- LINQ系列:LINQ to SQL Exists/In/Any/All/Contains
1. Any 返回没有Product的Category var expr = from c in context.Categories where !c.Products.Any() select c ...
随机推荐
- 21行python代码实现拼写检查器
引入 大家在使用谷歌或者百度搜索时,输入搜索内容时,谷歌总是能提供很好的拼写检查,比方你输入 speling,谷歌会立即返回 spelling. 前几天,看到http://norvig.com/spe ...
- Ambari-Blueprint介绍
Ambari-Blueprint总体介绍 ambari-blueprint主要作用是通过提供一个restAPI.调用几次API就能够创建一个集群.ambari-server解析stack下的role_ ...
- jQyery 整体架构
jQuery的模块 一.jQuery一共有13个模块: 1. 核心方法 2. 回调模块(callbacks) 3. 数据缓存 4. 异步队列(Deffered) 5. 选择器操做 6. 属性操作 7. ...
- 极客标签互动课程系列 - Javascript生成SVG动画素描特效
课程描写叙述:在这个课程中,我们将介绍SVG.而且介绍怎样使用javascript来控制SVG生成素描动画效果 课程地址:http://www.gbtags.com/gb/gbliblist/21.h ...
- School Personal Contest #1 (Codeforces Beta Round #38)---A. Army
Army time limit per test 2 seconds memory limit per test 256 megabytes input standard input output s ...
- bzoj 1601 灌水
题目大意: 决定把水灌到n块农田,农田被数字1到n标记 把一块土地进行灌水有两种方法,从其他农田饮水,或者这块土地建造水库 建造一个水库需要花费wi,连接两块土地需要花费Pij. 计算所需的最少代价 ...
- git ldap
https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md ldap : enabled : true host : 'ope ...
- 洛谷P1281 书的复制
题目描述 现在要把m本有顺序的书分给k给人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比如不能把第一.第三.第四本书给同一个人抄写. ...
- mkisofs
createrepo -g /enp/comps.xml . yum -y --downloadonly --downloaddir=/enp/Packages upgrade mkisofs -o ...
- nginx初相识
在本机上下载了一个nginx,版本为1.14.0. 安装: 对于安装比较简单,下载后解压到指定目录,目录结构如下 启动: 最简单的直接双击nginx.exe,有黑窗一闪而过,不要怀疑,看一下logs的 ...