猿教程 Logo

Linq聚合操作符:Aggregate

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效:去购买

聚合运算符对集合中元素的numeric属性执行数学运算,如Average,Aggregate,Count,Max,Min和Sum。

方法描述
Aggregate对集合中的值执行自定义聚合操作。
Average计算集合中数字项的平均值。
Count计算集合中的元素的数量。
LongCount计算集合中的元素的数量。
Max找到集合中的最大值。
Min找到集合中的最小值。
Sum计算集合中的值的总和。

Aggregate:

聚合方法执行累积操作。 聚合扩展方法有以下重载方法:

相关实例:

public static TSource Aggregate<TSource>(this IEnumerable<TSource> source, 
                                         Func<TSource, TSource, TSource> func);

public static TAccumulate Aggregate<TSource, TAccumulate>(this IEnumerable<TSource> source, 
                                         TAccumulate seed, 
                                         Func<TAccumulate, TSource, TAccumulate> func);

public static TResult Aggregate<TSource, TAccumulate, TResult>(this IEnumerable<TSource> source, 
                                         TAccumulate seed, 
                                         Func<TAccumulate, TSource, TAccumulate> func, 
                                         Func<TAccumulate, TResult> resultSelector);

以下示例演示了返回字符串列表的逗号分隔元素的Aggregate方法。

相关实例:

IList<String> strList = new List<String>() { "One", "Two", "Three", "Four", "Five"};

var commaSeperatedString = strList.Aggregate((s1, s2) => s1 + ", " + s2);

Console.WriteLine(commaSeperatedString);

运行结果:

One, Two, Three, Four, Five

在上面的示例中,Aggregate扩展方法从strList集合返回逗号分隔的字符串。 下图说明了上述示例中执行的整个聚合操作。


根据上图,strList“One”的第一项将作为s1传递,其余的项将作为s2传递。 lambda表达式(s1,s2)=> s1 +“,”+ s2将被视为s1 = s1 +“,”+ s1,其中s1将在集合中为每个项目累积。 因此,Aggregate方法将返回逗号分隔的字符串。

相关实例:

Dim strList As IList(Of String) = New List(Of String) From {
                                                            "One", 
                                                            "Two", 
                                                            "Three", 
                                                            "Four", 
                                                            "Five"
                                                        }

Dim commaSeparatedString = strList.Aggregate(Function(s1, s2) s1 + ", " + s2)

使用种子值的Aggregate方法

Aggregate的第二个重载方法需要种子值的第一个参数进行累加。 第二个参数是Func类型委托:TAccumulate Aggregate <TSource,TAccumulate>(TAccumulate seed,Func <TAccumulate,TSource,TAccumulate> func); 。

以下示例在Aggregate扩展方法中使用string作为种子值。

相关实例:

// Student collection
IList<Student> studentList = new List<Student>>() { 
        new Student() { StudentID = 1, StudentName = "John", Age = 13} ,
        new Student() { StudentID = 2, StudentName = "Moin",  Age = 21 } ,
        new Student() { StudentID = 3, StudentName = "Bill",  Age = 18 } ,
        new Student() { StudentID = 4, StudentName = "Ram" , Age = 20} ,
        new Student() { StudentID = 5, StudentName = "Ron" , Age = 15 } 
    };

string commaSeparatedStudentNames = studentList.Aggregate<Student, string>(
                                        "Student Names: ",  // seed value
                                        (str, s) => str += s.StudentName + "," ); 

Console.WriteLine(commaSeparatedStudentNames);

相关实例:

// Student collection
Dim studentList = New List(Of Student) From {
        New Student() With {.StudentID = 1, .StudentName = "John", .Age = 13},
        New Student() With {.StudentID = 2, .StudentName = "Moin", .Age = 21},
        New Student() With {.StudentID = 3, .StudentName = "Bill", .Age = 18},
        New Student() With {.StudentID = 4, .StudentName = "Ram", .Age = 20},
        New Student() With {.StudentID = 5, .StudentName = "Ron", .Age = 15}
    }
 Dim commaSeparatedStudentNames = studentList.Aggregate(Of String)(
               "Student Names: ", 
               Function(str, s) str + s.StudentName + ",")

Console.WriteLine(commaSeparatedStudentNames);

运行结果:

Student Names: John, Moin, Bill, Ram, Ron,

在上面的示例中,Aggregate方法的第一个参数是“Student Names:”字符串,将与所有学生姓名一起累积。 lambda表达式中的逗号将作为第二个参数传递。

以下示例使用Aggregate运算符添加所有学生的年龄。

相关实例:

// Student collection
IList<Student> studentList = new List<Student>>() { 
        new Student() { StudentID = 1, StudentName = "John", Age = 13} ,
        new Student() { StudentID = 2, StudentName = "Moin",  Age = 21 } ,
        new Student() { StudentID = 3, StudentName = "Bill",  Age = 18 } ,
        new Student() { StudentID = 4, StudentName = "Ram" , Age = 20} ,
        new Student() { StudentID = 5, StudentName = "Ron" , Age = 15 } 
    };

int SumOfStudentsAge = studentList.Aggregate<Student, int>(0, 
                                                (totalAge, s) => totalAge += s.Age  );

结果选择器的聚合方法:

现在,让我们看看第三个重载方法,它需要Func委托表达式的第三个参数为结果选择器,以便您可以制定结果。

请考虑以下示例。

相关实例:

IList<Student> studentList = new List<Student>>() { 
        new Student() { StudentID = 1, StudentName = "John", Age = 13} ,
        new Student() { StudentID = 2, StudentName = "Moin",  Age = 21 } ,
        new Student() { StudentID = 3, StudentName = "Bill",  Age = 18 } ,
        new Student() { StudentID = 4, StudentName = "Ram" , Age = 20} ,
        new Student() { StudentID = 5, StudentName = "Ron" , Age = 15 } 
    };

string commaSeparatedStudentNames = studentList.Aggregate<Student, string,string>(
                                            String.Empty, // seed value
                                            (str, s) => str += s.StudentName + ",", // returns result using seed value, String.Empty goes to lambda expression as str
                                            str => str.Substring(0,str.Length - 1 )); // result selector that removes last comma

Console.WriteLine(commaSeparatedStudentNames);

在上面的例子中,我们指定了一个lambda表达式str => str.Substring(0,str.Length - 1),它将删除字符串result中的最后一个逗号。 下面是VB.Net中的相同示例。

相关实例:

// Student collection
Dim studentList = New List(Of Student) From {
        New Student() With {.StudentID = 1, .StudentName = "John", .Age = 13},
        New Student() With {.StudentID = 2, .StudentName = "Moin", .Age = 21},
        New Student() With {.StudentID = 3, .StudentName = "Bill", .Age = 18},
        New Student() With {.StudentID = 4, .StudentName = "Ram", .Age = 20},
        New Student() With {.StudentID = 5, .StudentName = "Ron", .Age = 15}
    }

Dim commaSeparatedStudentNames = studentList.Aggregate(Of String, String)(
               String.Empty, 
               Function(str, s) str + s.StudentName + ",", 
               Function(str) str.Substring(0, str.Length - 1)) 

Console.WriteLine(commaSeparatedStudentNames);

运行结果:

John, Moin, Bill, Ram, Ron
注意

在C#或VB.Net中Aggregate 运算符不支持查询语法,只支持方法语法。

下一部分中将了解另一个汇总运算符 -Average  。

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效: 去购买


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/Linq/linq-aggregation-operator-aggregate.html