05 LINQ中的聚合函数Part-2

LINQ中的聚合函数最常用的有Sum(),Average(),Max(),Min()。顾名思义,这些聚合函数分别用于获取记录集中的“总和”、“平均数”、“最大值”、“最小值”。这些函数的使用也非常简单,下面举例介绍。

1) Sum()

List<int> intInList = new List<int>() { 1, 3, 3, 2, 7, 8, 4, 5, 6, 3, 9 };
int sumOfList = intInList.Sum();
Console.WriteLine(sumOfList);

2) Average()

List<int> intInList = new List<int>() { 1, 3, 3, 2, 7, 8, 4, 5, 6, 3, 9 };
double averageOfList = intInList.Average();
Console.WriteLine(averageOfList);

3)Max()

 List<int> intInList = new List<int>() { 1, 3, 3, 2, 7, 8, 4, 5, 6, 3, 9 };
 int maxOfList = intInList.Max();
 Console.WriteLine(maxOfList);

4)Min()

List<int> intInList = new List<int>() { 1, 3, 3, 2, 7, 8, 4, 5, 6, 3, 9 };
int minOfList = intInList.Min();
Console.WriteLine(minOfList);

上面介绍了常用聚合函数的用法,注意我用的是int型的List,如果我们有一个自定义的类该如何使用呢?更确切的说,比如现在我有一个Person类,里面有FirstName和LastName属性,那么当我调用Min()函数时,会发生什么?如下面的代码所示:

public class Person
{
    public string FirstName;
    public string LastName;
}
class Program
{

    static void Main(string[] args)
    {
        List<Person> personInList = new List<Person>()
        {
            new Person()
            {
                 FirstName = "Jonh",
                 LastName = "Liu"
            },
            new Person()
            {
                 FirstName = "Sara",
                 LastName = "Guo"
            },
            new Person()
            {
                 FirstName="Marttin",
                 LastName = "Zeng"
            },
            new Person()
            {
                 FirstName="Sccot",
                 LastName= "Jiang"
            }
        };

        Person minPerson = personInList.Min();
        Console.WriteLine(minPerson.FirstName);
    }
}

事实上,上面的代码会有一个运行时异常:

Unhandled Exception: System.ArgumentException: At least one object must implement IComparable.
   at System.Collections.Comparer.Compare(Object a, Object b)
   at System.Linq.Enumerable.Min[TSource](IEnumerable`1 source)
   at ConsoleApplication1.Program.Main(String[] args) in c:\D\others\Code\Test\ConsoleApplication1\Program.cs:line 51
Press any key to continue . . .

原因是.NET根本不知道如何判断Person类从而获取它的最小值。List<int>之所以能成功调用是因为.net知道如何去比较int型数据,从而求出最小值。为了让.NET知道如何去比较两个Person,从而决定他们的大小我们需要让Person类实现一个名为IComaparable<T>的接口,该接口定义了如何去判断两个对象的大小的方法。我们把Person类做如下修改:

public class Person:IComparable<Person>
{
    public string FirstName;
    public string LastName;

    public int CompareTo(Person obj)
    {
        return this.FirstName.CompareTo(obj.FirstName);
    }
}

上面的代码实现了让Person类通过FirstName属性进行比较,下面的代码就找出了personInList中的FirstName最小所对应的那个Person对象:

Person minPerson = personInList.Min();
Console.WriteLine(minPerson.FirstName);

当然,如果我们不想去修改Person类,因为Person类很可能是第三方已经写好的类,我们没办法修改一个已经打包好的dll文件,那么我们还可以调用Min()的重载函数:

public static TResult Min<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector);

这里,可以向Min()中传入一个代理,该代理指定了如何对Person排序,如下面的代码:

string minFirstName = personInList.Min(p => p.FirstName);
Console.WriteLine(minFirstName);
时间: 2024-12-26 16:33:05

05 LINQ中的聚合函数Part-2的相关文章

04 LINQ中的聚合函数(Aggregate function in LINQ)

试想一下,我们有一个List<int>数组,现在我们想对List中的所有值求和.在没学习LINQ之前我们会轻松的写出下面的代码: static void Main(string[] args) { List<int> array = new List<int>() { 1, 3, 3, 2, 7, 3, 2, 8, 5, 4, 6 }; int sum = 0; foreach (int item in array) { sum += item; } Console.W

在MongoDB中实现聚合函数

在MongoDB中实现聚合函数 随着组织产生的数据爆炸性增长,从GB到TB,从TB到PB,传统的数据库已经无法通过垂直扩展来管理如此之大数据.传统方法存储和处理数据的成本将会随着数据量增长而显著增加.这使得很多组织都在寻找一种经济的解决方案,比如NoSQL数据库,它提供了所需的数据存储和处理能力.扩展性和成本效率.NoSQL数据库不使用SQL作为查询语言.这种数据库有多种不同的类型,比如文档结构存储.键值结构存储.图结构.对象数据库等等. 我们在本文中使用的NoSQL是MongoDB,它是一种开

Entity Framework 6 Recipes 2nd Edition(11-9)译 -&gt; 在LINQ中使用规范函数

11-9. 在LINQ中使用规范函数 问题 想在一个LINQ查询中使用规范函数 解决方案 假设我们已经有一个影片租赁(MovieRental )实体,它保存某个影片什么时候租出及还回来,以及滞纳金等,如Figure 11-9. 所示: Figure 11-9. The MovieRental entity that has the dates for a rental period along with any late fees 我们想取得所有租期超过10天的影片 如何创建和使用查询,如Lis

oracle中的聚合函数count、max、min、sum、avg以及NVL函数的用法

oracle中的聚合函数count.max.min.sum.avg以及NVL函数的用法 分组函数聚合函数对一组行中的某个列执行计算执行计算并返回单一的值.聚合函数忽略空值.聚合函数经常与 SELECT 语句的 GROUP BY 子句一同使用,所以有的时候也把其称之为分组函数.这类函数通常应用于报表统计中,以下展示Oracle常用的聚合函数的应用. 分组函数的介绍 作用于一组数据,并对一组数据返回一个值. 常见的分组函数有: Count 用来计算有效数据的数量 Min 返回一个数字列或计算列的最小

Mysql中使用聚合函数对null值的处理

平时因为对于数据库研习的不深,所以在面试的时候问了一些平常遇到过的问题居然没法很肯定地回答出来,实在让自己很恼怒! 这次让我记忆深刻的一个问题是: 在mysql中使用聚合函数的时候比如avg(t),t是表中一个类型int型的字段,可为null,有三行数据,三行中的数据分别为:10,null,20,请问最后的结果是什么? 我的回答是15,在面试结束之后我尝试了一下结果没错,不过我对于聚集函数对null的处理貌似错了,我认为是聚合函数会将null值看作0,找了一番,博客中都认为是忽略null值,因为

sqlserver中的聚合函数

聚合函数:就是按照一定的规则将多行(Row)数据汇总成一行的函数,对数据进行汇总前,还可以按特定的列(coloumn)将数据进行分组(group by)再汇总,然后按照再次给定的条件进行筛选 一:Count函数1 SELECT COUNT(Birthday) FROM customer2 SELECT COUNT(*) FROM customer3 SELECT COUNT(1) FROM customer1和2区别:使用具体列名作为参数,该列不会计算该列的null值计算在Count之内2和3都

oracle语句中的聚合函数以及分组group by的使用实例

1 create table t_class2( 2 name varchar2(255), 3 subject varchar2(255), 4 score integer, 5 stuid integer 6 ) 7 8 insert into t_class2 values('张三','数学',89,1); 9 insert into t_class2 values('张三','语文',80,1); 10 insert into t_class2 values('张三','英语',70,1

21.MySQL中的聚合函数

函数名 描述 COUNT() 返回参数字段的数量,不统计为NULL的记录 SUM() 返回参数字段之和 AVG() 返回参数字段的平均值 MAX() 返回参数字段的最大值 MIN() 返回参数字段的最小值 GROUP_CONCAT() 返回符合条件的参数字段值的连接字符串 JSON_ARRAYAGG() 将符合条件的参数字段值做为单个JSON数组返回,MySQL5.7.22新增 JSON_OBJECTAGG() 将符合条件的参数字段值做为单个JSON对象返回,MySQL5.7.22新增 COUN

选择列表中的列……无效,因为该列没有包含在聚合函数或 GROUP BY 子句中

今天用SQL Server尝试实现一个SQL语句的时候,报了如标题所示的错误,通过在百度里面搜索,并亲自动手实现,终于发现问题所在,现在把它记录下来. 语句如下: select [OrderID],[ProductID], min(UnitPrice) as MinUnitPrice into NewDetails FROM [Northwind].[dbo].[Order Details] Group by [OrderID] 执行该语句之后,SQL Server报错如下: "消息 8120,