C#  中的LINQ 提供了两种操作方式,查询表达式和查询操作符,所有的查询表达式都有对应的查操作符类替代,查询表达式有点“类” SQL,在代码中写SQL,总觉得不够“优雅”,使用查询操作符就显得“优雅”很多, 本系列就来对所有的LINQ 标准操作符进行一个全面的总结,这些操作符和我上篇文章总结的RxJS操作符有很多相似之处,甚至想通之处,有兴趣的可以点击链接查看。从整体来看C# 的LINQ 操作符分为13类,分别为聚合,转换,元素操作,相等操作,生成,分组,连接(join),分部,投影,数量,过滤,基于集的操作符,排序。熟练掌握LINQ对写代码的效率有很大的提高,可以说LINQ ,lambda和泛型已经变成C# 语言的基石。如果没有这三个特性下代码将会变得多么的无趣。

聚合操作符

聚合操作的所有返回值都只是一个值。

为了演示这里我们定义两个数组,一个表示字符串的数组textSource和一个表示int 类型的 numberSource数组:

static string[] textSource = { "zero", "one", "two", "three","four","five","six","seven","eight","nine" };
static int[] numberSource = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

1.Sum 针对内置数值类型或者通过使用委托从元素内部转换为内部数值类型元素的序列进行求和。如:

//对int类型的序列进行直接累加求和
Console.WriteLine(numberSource.Sum()); //45
//对int类型的序列中的每个元素进行平方后进行累加求和
Console.WriteLine(numberSource.Sum(s =>s*s));//285
//对字符串数组中的每一个字符串的长度进行累加求和
Console.WriteLine(textSource.Sum(s=>s.Length));//40

2.Average 针对内置数值类型或者通过使用委托从元素内部转换为内部数值类型元素的序列进行求平均数。 如:

//对int类型的序列进行直接求平均数
Console.WriteLine(numberSource.Average()); //4.5
//对int类型的序列中的每个元素进行平方后进行求平均数
Console.WriteLine(numberSource.Average(s => s * s));//28.5
//对字符串数组中的每一个字符串的长度进行求平均数
Console.WriteLine(textSource.Average(s => s.Length));//4

3.Count & LongCount 两个操作符作用都是求集合中元素的个数,仅仅是返回的类型不同,Count 返回int 类型, LongCount 返回 long 类型。如:

//求数组中的元素数量
Console.WriteLine(numberSource.Count()); //10
//求数组中元素小于6的元素的数量
Console.WriteLine(numberSource.Count(s => s<6));//6
//求字符串长度大于4的元素的数量
Console.WriteLine(textSource.Count(s => s.Length>4));//3 //求数组中的元素数量
Console.WriteLine(numberSource.LongCount()); //10
//求数组中元素小于6的元素的数量
Console.WriteLine(numberSource.LongCount(s => s < 6));//6
//求字符串长度大于4的元素的数量
Console.WriteLine(textSource.LongCount(s => s.Length > 4));//3

4. Min & Max 两个操作符计算集合中最大或最小值,并且可以传入委托对结果进行处理。如:

//求int 数组中的元素的最小值
Console.WriteLine(numberSource.Min()); //0
//求int数组中元素的最小值并和1进行比较
Console.WriteLine(numberSource.Min(s => s > 1));//False
//求字符串数组中最短字符串的长度
Console.WriteLine(textSource.Min(s=>s.Length));//3 //求int 数组中的元素的最大值
Console.WriteLine(numberSource.Max()); //9
//求int数组中元素的最大值并和1进行比较
Console.WriteLine(numberSource.Max(s => s > 1));//True
//求字符串数组中最长字符串的长度
Console.WriteLine(textSource.Max(s => s.Length));//5

5.Aggregate 这个操作符是非常灵活的一个操作符,所有的聚合操作符都可以用这个操作符来替代, 这个操作符还可以将结果通过委托转换成其它类型,使用非常广泛。下面我将使用Aggregate 操作符对上面讲到的操作符进行等价操作。

//对int类型的序列进行直接累加求和
var sum = numberSource.Aggregate((current, item) => current + item);
Console.WriteLine(sum);//45 //对int类型的序列中的每个元素进行平方后进行累加求和
Console.WriteLine(numberSource.Aggregate((current, item) => current + item * item));//285 //对字符串数组中的每一个字符串的长度进行累加求和
Console.WriteLine(textSource.Aggregate(0, (current, item) => current + item.Length));//40 //对int类型的序列进行直接求平均数
Console.WriteLine(numberSource.Aggregate(0, (current, item) => current + item, result => (float)result / numberSource.Length)); //4.5 //对int类型的序列中的每个元素进行平方后进行求平均数
Console.WriteLine(numberSource.Aggregate(0, (current, item) => current + item * item, result => (float)result / numberSource.Length));//28.5 //对字符串数组中的每一个字符串的长度进行求平均数
Console.WriteLine(textSource.Aggregate(0, (current, item) => current + item.Length, result => (float)result / numberSource.Length));//4 //求数组中的元素数量
Console.WriteLine(numberSource.Aggregate(0, (current, item) => current + 1)); //10 //求数组中元素小于6的元素的数量
Console.WriteLine(numberSource.Aggregate(0, (current, item) => item < 6 ? (current + 1) : current));//6 //求字符串长度大于4的元素的数量
Console.WriteLine(textSource.Aggregate(0, (current, item) => item.Length > 4 ? (current + 1) : current));//3 //求int 数组中的元素的最小值
Console.WriteLine(numberSource.Aggregate(0, (current, item) => item <current ? current=item : current)); //0 //求int数组中元素的最小值并和1进行比较
Console.WriteLine(numberSource.Aggregate(0, (current, item) => item < current ? current = item : current,resut=>resut>1));//False //求字符串数组中最短字符串的长度
Console.WriteLine(textSource.Aggregate(10, (current, item) => item.Length < current ? current = item.Length : current));//3 //求int 数组中的元素的最大值
Console.WriteLine(numberSource.Aggregate(0, (current, item) => item > current ? current = item : current)); //9
//求int数组中元素的最大值并和1进行比较
Console.WriteLine(numberSource.Aggregate(0, (current, item) => item > current ? current = item : current, resut => resut > 1));//True
//求字符串数组中最长字符串的长度
Console.WriteLine(textSource.Aggregate(0, (current, item) => item.Length > current ? current = item.Length : current));//5 //在100 的基础上对numberSource的每一项进行求和
var sumWithSeed = numberSource.Aggregate(100, (current, item) => current + item);
Console.WriteLine(sumWithSeed);//145 //在100 的基础上对numberSource的每一项进行求和,并对结果进行平方
var sumWithSeedAndResultSquare = numberSource.Aggregate(100, (current, item) => current + item, result => result * result);
Console.WriteLine(sumWithSeedAndResultSquare);//21025 //在100 的基础上对numberSource的每一项进行平方后求和,并对结果进行开平方根
var sumWithSeedItemSquareAndResultSqrt = numberSource.Aggregate(100, (current, item) => current + item * item, result => Math.Sqrt(result));
Console.WriteLine(sumWithSeedItemSquareAndResultSqrt);//19.621416870348583 //字符串拼接
var concatArray = textSource.Aggregate((current, item) => current + "," + item);
Console.WriteLine(concatArray);//zero,one,two,three,four,five,six,seven,eight,nine //拼接字符串病带有每个字符的长度
var concatArrayWithLength = textSource.Aggregate("",(current, item) => current + "," + item+":"+item.Length,resut=>resut.TrimStart(','));
Console.WriteLine(concatArrayWithLength);//zero:4,one:3,two:3,three:5,four:4,five:4,six:3,seven:5,eight:5,nine:4

所有的其他聚合操作符都能表示 为对Aggregate的调用,虽然这样做会相对繁琐。其基本思想就是,总是存在以初始元素开头的 “当前结果”。聚合委托被应用于输入序列的每个元素;委托取得当前结果和输入元素,并生成下 一个结果。作为最终可选步骤,转换被应用于聚合结果上,并将其转换为这个方法的返回值。如 果有必要,这种转换可以产生不同的数据类型。

聚合操作符非常简单,这些操作符都是立即执行的,只要代码被调用就会立即 返回结果。

【LINQ标准查询操作符总结】之聚合操符的更多相关文章

  1. Linq 标准查询操作符三

    本文介绍了LINQ标准查询操作符.没有这些操作符,LINQ就不会存在.本文为理解这些操作符的功能提供了很好的基础.了解它们将会很有帮助,因为LINQ的各种Provider都是基于这些操作符来完成各自丰 ...

  2. LINQ 标准查询操作符

    本文介绍了LINQ标准查询操作符.没有这些操作符,LINQ就不会存在.本文为理解这些操作符的功能提供了很好的基础.了解它们将会很有帮助,因为LINQ的各种Provider都是基于这些操作符来完成各自丰 ...

  3. LINQ标准查询操作符详解(转)

     一. 关于LINQ       LINQ 英文全称是“Language-Integrated Query”,中文为“语言集成查询”,它是微软首席架构师.Delphi 之父和C# 之父——Anders ...

  4. LINQ标准查询操作符(三)——Aggregate、Average、Distinct、Except、Intersect、Union、Empty、DefaultIfEmpty、Range、Repeat

    七.聚合操作符 聚合函数将在序列上执行特定的计算,并返回单个值,如计算给定序列平均值.最大值等.共有7种LINQ聚合查询操作符:Aggregate.Average.Count.LongCount.Ma ...

  5. LINQ标准查询操作符(四) —AsEnumerable,Cast,OfType,ToArray,ToDictionary,ToList,ToLookup,First,Last,ElementAt

    十.转换操作符 转换操作符是用来实现将输入对象的类型转变为序列的功能.名称以“As”开头的转换方法可更改源集合的静态类型但不枚举(延迟加载)此源集合.名称以“To”开头的方法可枚举(即时加载)源集合并 ...

  6. Linq标准查询操作符

     Linq的出现让代码简洁了不少.之前在项目中基本都在使用它,但是没有完整的整理过,今天借这个周末,将其进行整理,方便后期对其的使用.Linq的操作可以分为聚合,连接,转换,元素操作符,相等操作,生成 ...

  7. LINQ标准查询操作符(五)

    十二.相等操作符 如果两个序列的对应元素相等且这两个序列具有相同数量的元素,则视这两个序列相等. SequenceEqual方法通过并行地枚举两个数据源并比较相应元素来判断两个序列是否相等.如果两个序 ...

  8. LINQ标准查询操作符(二)——Join、GroupJoin、GroupBy、Concat、

    四.联接操作符 联接是指将一个数据源对象与另一个数据源对象进行关联或者联合的操作.这两个数据源对象通过一个共同的值或者属性进行关联. LINQ有两个联接操作符:Join和GroupJoin. 1. J ...

  9. LINQ标准查询操作符(一)——select、SelectMany、Where、OrderBy、OrderByDescending、ThenBy、ThenByDescending和Reverse

    一.投影操作符 1. Select Select操作符对单个序列或集合中的值进行投影.下面的示例中使用select从序列中返回Employee表的所有列: //查询语法 var query = fro ...

随机推荐

  1. django3开发完整博客带评价

    纯django开发最完美博客 2020年5月打造最时尚博客系统教程 为了学习速度,集中精力学习django和博客开发, 没有使用其它框架,也没有使用css预处理等 这样学起来最方便, 博客前后端都完成 ...

  2. css的属性选择器

    语法说明: 属性选择器需要将对应属性放入到 方括号中  [ ] ,其中包含属性名,标识符(* $ ~ ^ |) 使用说明: [attribute] 例如  [target] 表示 选择带有 targe ...

  3. M - 昂贵的聘礼 最短路 dij

    http://poj.org/problem?id=1062 这个题目有一点点特别,因为数据很小也可以用Floyd跑,但是个人比较钟爱dij. 这个dij是怎么走的呢,首先就是普通的建图,然后就是带上 ...

  4. Java种sleep和wait的区别

    1,sleep方法是Thread类的静态方法,wait()是Object超类的成员方法 2,sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时 ...

  5. LTE网络概述

    LTE主要由两部分组成:无线接入技术演进(E-UTRAN)+系统架构演进(SAE):其中,SAE主要含有的是演进型分组交换核心网(EPC),其控制处理部分为移动性管理实体(MME),数据承载部分称为业 ...

  6. 王颖奇 201771010129《面向对象程序设计Java》第十八周实验总结

    实验十八  总复习 实验时间 2018-12-30 1.实验目的与要求 (1) 综合掌握java基本程序结构: (2) 综合掌握java面向对象程序设计特点: (3) 综合掌握java GUI 程序设 ...

  7. String、StringBuffer和StringBuilder比较

    从执行速度效率来说: String为字符串常量,一旦创建就不能修改,第一次创建一个String对象,实例化后有初始值:当第二次创建String对象后,再次赋值,表面上看是改变了第一个String对象的 ...

  8. React-Router 4 两个常用路由变量

    讲真我个人不太喜欢4.x版本,虽然作者自信动态路由的形式符合React组件化的哲学,但是路由和一般组件耦合太深,而且后期组件分片也麻烦,以后需要重构的话怕是会一番折腾.同学公司用的还是3.x版本. 不 ...

  9. 有一分数序列:2/1, 3/2, 5/3, 8/5, 13/8, 21/13....求出这个数列的第M到N项之和(M>2,N>2,N>M)

    package bianchengti; /* * 有一分数序列:2/1, 3/2, 5/3, 8/5, 13/8, 21/13.... * 求出这个数列的第M到N项之和(M>2,N>2, ...

  10. class.getFields和class.getDeclareFields的区别

    class.getFields的定义 返回类提供的public域包括超类的共有变量; 注: 是public,我们平时定义变量一般用的private,如果用getFields是不会获得. class.g ...