Linq之求和,平均值,最大值,最小值

写在前面

最近一直在弄统计的内容,和统计相关的操作,就需要用到了,而有些在数据库中操作起来非常不方便,没办法就用c#中的linq来实现了。

代码

一个例子

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Wolfy.LinqAggregation
{
    class Program
    {
        static void Main(string[] args)
        {
            //生成测试数据
            List<Product> list = new List<Product>();
            Random r = new Random();
            for (int i = 0; i < 5; i++)
            {
                float iran = r.Next(1, 111);
                Product pro = new Product() {
                    ID = i + 1,
                    Name = "宝马" + i.ToString(),
                    Price = iran * 1000,
                    ProductDate = DateTime.Now.AddDays(i) };
                Product pro2 = new Product() {
                    ID = i + 1,
                    Name = "宝马" + i.ToString(),
                    Price = iran * 1000,
                    ProductDate = DateTime.Now.AddDays(i) };
                list.Add(pro);
                list.Add(pro2);
            }
            //求和,求所有的产品总价
            var sumResult = from s in list
                            //根据id分组 将分组后的结果集存入p
                            group s by s.ID into p
                            //此时结果集已经是p,所以要从p中取数据。
                            select new {
                                key = p.Key,
                                sum = p.Sum(x => x.Price),
                                min = p.Min(x => x.Price),
                                max = p.Max(x => x.Price),
                                average = p.Average(x => x.Price),
                                count=p.Count() };
            foreach (var item in sumResult)
            {
                Console.WriteLine("id:" + item.key);
                Console.WriteLine("分组的单价总和:" + item.sum);
                Console.WriteLine("分组的最小值:"+item.min);
                Console.WriteLine("分组的最大值:" + item.max);
                Console.WriteLine("分组的平均值:" + item.average);
                Console.WriteLine("分组的中个数:" + item.count);
            }
            Console.Read();
        }
    }
    /// <summary>
    /// 产品类
    /// </summary>
    class Product
    {
        /// <summary>
        /// 产品id
        /// </summary>
        public int ID { set; get; }
        /// <summary>
        /// 产品名称
        /// </summary>
        public string Name { set; get; }
        /// <summary>
        /// 产品单价
        /// </summary>
        public double Price { set; get; }
        /// <summary>
        /// 生产日期
        /// </summary>
        public DateTime ProductDate { set; get; }

    }
}

测试结果

总结

在写group的时候,第一上手就出错了,很久没用linq中的group,忘记怎么使用了,竟然还有个into,跟sql语法差别就在这里。这里练习一下,做个备忘。

参考

http://www.cnblogs.com/wuchao/archive/2012/12/25/2832744.html

linq入门系列导航

时间: 2024-12-24 08:27:41

Linq之求和,平均值,最大值,最小值的相关文章

11.2.2 例题 11-2 UVA 1395 Slim Span (最大值-最小值尽可能小的生成树)

题目大意: 给你n个点(n<=100),然后,让你找到一棵生成树,使得 最大值-最小值的边权尽可能的小的生成树. 解题思路: 还是按照最小生成树的思路,一开始对所有的边按照权值大小,从小到大排序.然后,对于一个区间[L,R],我们每次枚举的时候,如果这个[L,R]使得所有的n个点都联通了,那么定义他们的苗条度为: 最大值-最小值.这个苗条度肯定是<=cost[r]-cost[l].那么,我们就依次枚举这个l,每次都以[l,m]区间内的边建立最小生成树, 如果不能满足n个点的联通,那么就返回-1

Java 数组工具类排序,最大值最小值等

public class ArrayUtils{ /** * 返回数组最大值 * * @param a * @return */ public static int max(int[] a){ // 返回数组最大值 int x; int aa[]=new int[a.length]; System.arraycopy(a,0,aa,0,a.length); x=aa[0]; for(int i=1;i<aa.length;i++){ if(aa[i]>x){ x=aa[i]; } } retu

求数组元素的最大值最小值

这是编程之美上的一个题目: 一般的做法: void main() { int a[5]={78,63,78,67,18}; int min=0,max=0; min=max=a[0]; for(int i=0;i<5;i++) { if(min>a[i]) min=a[i]; if(max<a[i]) max=a[i]; } printf("%d,%d\n",max,min); } 这种方法总共比较了2*N次 如何降低比较次数呢? 我在这里着重记录一下分冶法的做法:

正则验证数字和最大值最小值

package com.lwj.util; import java.util.regex.Pattern; public class SetParameterUtil { /** * 验证是否为数字 * @param value * @return */ public static boolean isInteger(String value){ return Pattern.compile("^-?\\d+$").matcher(value).find(); } /** * 验证最大

分治法求数组的最大值最小值

实现求数组的最大值最小值,蛮力法要容易的多.本着重在体验分治法的思想的原则: 1 int main(void) 2 { 3 void Maxmin(int a[],int low,int high,int maxmin[2]); 4 int a[10],maxmin[2]; 5 6 printf("Enter 10 integer numbers:\n"); 7 for(int i=0;i<10;i++) 8 scanf("%d",a+i); 9 10 Max

MapReduce求最大值最小值问题

import java.io.File; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapred.JobConf; import org.apache.hadoop.mapreduce.Job; import

双栈队列实现快速获取队列最大值最小值

1 思路: 自己实现一个栈,其中成员为标准库中的栈,一个存放全部的元素,一个存放最小元素,一个存放最大元素. 使用自己实现的栈来实现一个求最大值最小值的队列,其中包含两个成员,一个作为出队的栈,一个作为入队的栈. 2 C++实现代码: #include<iostream> #include<stack> #include<cstdlib> using namespace std; template <typename T> class minmaxStack

mydate97时间控件最大值最小值限制及Javascript日期判断大小

<script language="javascript" type="text/javascript" src="<%=basePath %>js/datePicker/WdatePicker.js"></script><form id="searchForm" action="trans/triplist" method="post" ons

HYSBZ 1036 树链剖分(单点更新区间求和求最大值)

http://www.lydsy.com/JudgeOnline/problem.php?id=1036 Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从点u到点v的路径上的节点包括u和v本身 Input 输入

第四届河南省acm省赛 走迷宫(二分法枚举差值和最大值最小值+DFS)

走迷宫 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 Dr.Kong设计的机器人卡多非常爱玩,它常常偷偷跑出实验室,在某个游乐场玩之不疲.这天卡多又跑出来了,在SJTL游乐场玩个不停,坐完碰碰车,又玩滑滑梯,这时卡多又走入一个迷宫.整个迷宫是用一个N * N的方阵给出,方阵中单元格中填充了一个整数,表示走到这个位置的难度. 这个迷宫可以向上走,向下走,向右走,向左走,但是不能穿越对角线.走迷宫的取胜规则很有意思,看谁能更快地找到一条路径,其路径上单元格最大难度值与