using System.Collections.Generic;
public class Stat<T> where T:struct,IComparable
public IDictionary<T,int>Occurences{get;set;}
Occurences = new Dictionary<T,int>();
public override string ToString(){
var occ = string.Join(",",Occurences.Select(o=>string.Format("({0}:{1})",o.Key,o.Value)));
return string.Format("Min = {0} Max = {1} Nb = {2} Sum={4} Mut={5} Occ=[{3}]" ,Min,Max,Nb,occ,Sum,Mut);
public static void Main()
var liste = new List<int>{2,54,5,45,78,54,2,6,47,65,25,41,20,32,12,78};
var agg = liste.Aggregate(new Stat<int>(),(a,n) => {
if(n> a.Max || a.Max==null)a.Max=n;
if(n<a.Min || a.Min==null)a.Min=n;
if(a.Occurences.ContainsKey(n))a.Occurences[n]++;
else a.Occurences.Add(n,1);
Console.WriteLine(agg.ToString());