Linq一共包含五十几个查询运算符,常用的根据类型来区分一共有5类左右,这五类里面一些事在项目查询中经常用到的。不过linq运算符的命名十分规范,基本从字面意思就能猜测出来是干嘛用的,下面我们挑选一些常用的来介绍一下。根据分类我们能分成下面4种类型:

1.返回IEnumerable<T>类型的

  1.1  Where:主要用于对于序列的筛选,跟在sql中对数据筛选用法是一样的

 int[] array = { , , , ,  };
var query = array.Where(p => p >= ); //输出 3,5,7,2

  1.2  OfType:这个也用于筛选数据,跟where不同之处在于是对某一类型的数据筛选,根据指定类型对IEnumerable元素的筛选

 List<object> list = new List<object>();
list.Add("Power");
list.Add();
list.Add(DateTime.Now);  
var query = list.OfType<string>().Where(p => p.StartsWith("P")); //输出 Power

  1.3  Cast:定义在IEnumerable上,用于将非泛型的序列转成泛型序列,当转换不成功的时候,则会抛出异常

 ArrayList al = new ArrayList();
al.Add();
al.Add();
al.Add("df"); //抛出System.InvalidCastException异常

  1.4  OrderBy,ThenBy,OrderByDescending,ThenByDescending:这几个就是排序,排序,排序。唯一要注意的事情是ThenBy是在IOrderedEnumerable<T>上面定义的拓展方法,因为不能直接在IEnumerable<T>上调用,ThenBy的调用只能排在OrderBy之后

 List<Product> list2 = new List<Product>();
list2.Add(new Product() {Index = ,value = });
list2.Add(new Product() { Index = value = });
list2.OrderBy(p => p.Index).ThenBy(p => p.value);

  1.5  Select:实现了投影操作,可以在其内对对象类型进行转换。例如在select出来的对象中,将其转换成我们所需要的类型

 list2.Select(p=>new Product {Index = p.Index});//新建了一个product对象

  

  1.6  Take,Skip:skip是跳过几个元素,take是取几个元素,这两个东西用于分页,例如我们想跳过前面十行的数据,取后面十行的数据

 var q = list.Skip().Take();

  

  1.7  TakeWhile(),SkipWhile():

    TakeWhile在遇到不符合条件的元素的时候返回前面找到符合条件的元素

 int[] arr = {, , , , ,};
var query1 = arr.TakeWhile(x => x <= ); //输出 1 

    SkipWhile会一直跳过符合条件的元素,直到遇到第一个不符合条件的元素,然后取该元素后面的所有元素

 var query2 = arr.SkipWhile(x => x <= );//输出  4  8 2 3 1

  

  1.8  Reverse()用于将序列中的元素逆序排列

  1.9  DefaultIfEmpty()当序列为空的时候,DefaultIfEmpty会添加一个默认值或者指定值,这个在做left join或right join中比较好用,当为空值的时候,我们可以指定他的值

 int[] arr = {};
var query2 = arr.DefaultIfEmpty();//输出 0

  1.10 Distinct()主要用于去重复序列

 int[] arr = {, , , };
var query2 = arr.Distinct();
query2.ToList().ForEach(p=> Console.Write(p));//输出 1 2 3 

  Int类型能够实现去重复的原因是Int类型继承了IComparable,当假如我们想对一个类的一个字段进行去重复,我们可以调用Distinct的一个重载方法,传递继承于IEqualityComparer<T>的Class

 public class ProductComparer:IEqualityComparer<Product>
{
  public bool Equals(Product a, Product b)
{
  return a.Index == b.Index;
} public int GetHashCode(Product obj)
{
  return obj.Index;
}
} 14 public class Product
15 {
16    public int Index { get; set; }
17 } Product[] array = new[]{
new Product() {Index = },
new Product() {Index = },
new Product() {Index = },
new Product() {Index = }
}; ProductComparer pc = new ProductComparer();
var query2 = array.Distinct(pc); //输出 1 2 3

  1.11 GroupBy:在SQL中,group by只能跟聚合函数一起搭配使用,但在linq中,groupby出来的东西可以是一个树形结构

 List<Product> list = new List<Product>()
{
new Product() {Index = ,Value = },
new Product() {Index = ,Value = },
new Product() {Index = ,Value = },
new Product() {Index = ,Value = },
new Product() {Index = ,Value = },
}; var query2 = list.GroupBy(p => p.Index).ToList(); foreach (var item in query2)
{
Console.Write(item.Key+"-");
foreach (var product in item)
{
Console.Write(product.Value);
Console.WriteLine( );
}
} //输出 1-1 2-2 3 3-3 4-5

  1.12 Intersect(),Except():Intersect是返回两个序列中相同元素构成的序列,Except则相反

 int[] arr1 = {, , };
int[] arr2 = { , , };
var query2 = arr1.Intersect(arr2); //输出 2

  1.13  Concat(),Union():concat用于连接两个序列,union也是连接两个序列,但是会剔除相同的项目

  1.14 Zip():将两个序列中index相同的元素,组成一个新的元素,长度以短的为准

 int[] arr = {, , , };
string[] arr2 = {"一", "二", "三", "四", "五"};
var query = arr.Zip(arr2, (x, y) => string.Format("{0},{1}", x, y));
//输出 1,一 2,二 3,三 4,四

2.返回其他序列类型

  ToArray,ToList,ToDictionary,ToLookUp这几个都是将IEnumerable<T>转换成相应类型,就跟平常Tolist一样,没有延迟加载,立即返回。

3.返回序列中的元素

  3.1   ElementAt(),ElementAtOrDefault():ElementAt(index)返回下标值为index的元素,不存在的话抛出异常,用ElementAtOrDefault这个返回该类型的默认值来解决异常情况

  3.2   First(),FirstOrDefault():First 返回满足条件的第一个序列元素,不存在的话抛出异常,用FirstOrDefault这个返回该类型的默认值来解决异常情况

  3.3   Last(),LastOrDefault():Last返回满足条件的最后一个序列元素,不存在的话抛出异常,用LastOrDefault这个返回该类型的默认值来解决异常情况

  3.4   Single(),SingleOrDefault():Single跟上面几个有点不一样的地方,它要求序列中有且仅有一个满足条件的项,当大于一项的时候,会抛出异常。SingleOrDefault用于当查询结果为0项时,返回类型默认值。

4.返回标量值

  4.1  Count(),LongCount(),Max(),Min(),Average(),Sum():这几个估计大家都非常熟悉了,凭借字面意思就能知道大概了,我们直接来看例子:

 int[] arr = {, , , };
int query1 = arr.Count();
Console.WriteLine(query1); //输出 4 int query2 = arr.Max();
Console.WriteLine(query2);//输出 4 int query3 = arr.Min();
Console.WriteLine(query3); //输出 1 double query4 = arr.Average();
Console.WriteLine(query4); //输出 2.5 int sum = arr.Sum();
Console.WriteLine(sum);//输出 10

  4.2  Aggregate():返回自定义的聚合,例如每个元素乘2,再相加

 int sum2 = arr.Aggregate(, (total, x) => total + (x*));
Console.WriteLine( sum2);//输出20

  4.3  Contains(),Any(),All(),SequenceEqual()

      Contains:判断某一元素是否在存在序列中

      Any:判断序列中是否存在满足表达式的元素,只要有一个元素满足,返回True。我们经常会判断某一list不为空时,用list.count!=0,这样是比较浪费性能因为会去统计该list全部个数,当我们用any的时候,只要判断第一个元素即可

      All:判断序列中是否全部元素都满足表达式,只要一个不满足,则返回fasle

      SequenceEqual:用于逐项比较两个序列,当两个序列中元素数目相同,并且元素位置一样,则返回true,否则false

完结

  感谢大家观看,祝大家2016年快乐!

Linq常用查询运算符的更多相关文章

  1. C#3.0新增功能09 LINQ 标准查询运算符 04 运算

    连载目录    [已更新最新开发文章,点击查看详细] 本篇主要介绍标准查询运算符的常用运算功能. 01 对数据排序 排序操作基于一个或多个属性对序列的元素进行排序. 第一个排序条件对元素执行主要排序. ...

  2. LINQ标准查询运算符的执行方式-延时之流式处理

    linq的延时执行是指枚举时才去一个个生成结果元素. 流式处理是linq延时执行的一种,在生成元素前不需要获取所有源元素,只要获取到的源元素足够计算时,便生成结果元素. 流式处理的标准查询运算符返回值 ...

  3. .NET LINQ标准查询运算符

    标准查询运算符概述      “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法. 大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了 IEnumerable<T> ...

  4. C#3.0新增功能09 LINQ 标准查询运算符 01 概述

    连载目录    [已更新最新开发文章,点击查看详细] 标准查询运算符 是组成 LINQ 模式的方法. 这些方法中的大多数都作用于序列:其中序列指其类型实现 IEnumerable<T> 接 ...

  5. C#3.0新增功能09 LINQ 标准查询运算符 03 按执行方式的分类

    连载目录    [已更新最新开发文章,点击查看详细] 标准查询运算符方法的 LINQ to Objects 实现主要通过两种方法之一执行:立即执行和延迟执行.使用延迟执行的查询运算符可以进一步分为两种 ...

  6. C#3.0新增功能09 LINQ 标准查询运算符 02 查询表达式语法

    连载目录    [已更新最新开发文章,点击查看详细] 某些使用更频繁的标准查询运算符具有专用的 C# 语言关键字语法,使用这些语法可以在查询表达式中调用这些运算符. 查询表达式是比基于方法的等效项更具 ...

  7. LINQ标准查询运算符的执行方式-即时

    即时,声明查询的位置立即执行.查询返回如果是不可以枚举的的结果,都会立即执行. 执行方式为“”即时”的查询运算符有下面这些. Aggregate 应用累计器函数和结果选择器,返回传入泛型类型TSour ...

  8. linq标准查询运算符

    Order By操作 适用场景:对查询出的语句进行排序,比如按时间排序等等. 说明:按指定表达式对集合排序:延迟,:按指定表达式对集合排序:延迟,默认是升序,加上descending表示降序,对应的扩 ...

  9. C# Linq 常用查询操作符

    限定操作: 1. All:用来确定是否序列中的所有元素都满足条件 2. Any:用来确定序列是否包含任何元素,有参方式用来确定序列中是否有元素满足条件 3. Contains:方法用来确定序列是否包含 ...

随机推荐

  1. 使用Chrome测试页面响应性

    如今我们都知道 响应式 的意思.作为开发者,我们常常开发一些响应式的应用.有很多工具可以帮助我们完成这个目的.某些人甚至使用付费扩展.然而,我用了一个东西,它就是 Google Chrome 浏览器. ...

  2. [King.yue]EXT.Grid行双击事件

    .Listeners(l => {l.CellDblClick.Handler = string.Format(@"alert('xx');"); })

  3. .Net 程序的运行

    1. 用.Net开发的程序运行的某台机器上必须安装.Net FrameWork 2. .Net FrameWork向下兼容的实现 在安装4.0的时候,会把3.5,2.0等低版本的都装上,从而实现向下兼 ...

  4. sublimelinter-jshinter

    --- ocalhost:~ nihao$ sudo npm install jshint -gPassword:/usr/local/bin/jshint -> /usr/local/lib/ ...

  5. Clean Code – Chapter 6 Objects and Data Structures

    Data Abstraction Hiding implementation Data/Object Anti-Symmetry Objects hide their data behind abst ...

  6. 【Java基础】Integer包装类的缓冲池问题

    首先看下面这个例子: public class TestNew { public static void main(String args[]){ Integer i1 = 10; //Integer ...

  7. C# WinForm多线程(三)---- Control.Invoke[转]

    开发中遇到更新Winform中控件假死问题,通过看了这篇文章了解了原理,感谢!此处标记起来,以备查看! 原文地址:http://www.cnblogs.com/joechen/archive/2009 ...

  8. 教程-Delphi各种退出break,continue, exit,abort, halt, runerror

    delphi中表示跳出的有break,continue, exit,abort, halt, runerror.1.break 强制退出循环(只能放在循环中),用于从For语句,while语句或rep ...

  9. Block介绍(一)基础

    一.概述 Block是C级别的语法和运行时特性.Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存.堆内存的引用,我们甚至可以将一个Block作为参数传给其他的函数或者Block ...

  10. iOS消息推送机制的实现

    研究了一下Apple Push Notification Service,实现的很简单,很环保.原理如下 财大气粗的苹果提供了一堆服务器,每个ios设备和这些服务器保持了一个长连接,ios版本更新提示 ...