【LINQ标准查询操作符总结】之聚合操符

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 针对内置数值类型或者通过使用委托从元素内部转换为内部数值类型元素的序列举行求和。如:

python调用大漠插件教程03窗口绑定实例

//对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的挪用,虽然这样做会相对繁琐。其基本思想就是,总是存在以初始元素开头的 “当前效果”。聚合委托被应用于输入序列的每个元素;委托取得当前效果和输入元素,并天生下 一个效果。作为最终可选步骤,转换被应用于聚合效果上,并将其转换为这个方式的返回值。如 果有需要,这种转换可以发生差别的数据类型。

聚合操作符异常简朴,这些操作符都是立刻执行的,只要代码被挪用就会立刻 返回效果。

原创文章,作者:admin,如若转载,请注明出处:https://www.2lxm.com/archives/12964.html