LINQ - Aggregate Operators


LINQ
Aggregate Operators
Data
en-US
8/24/2011
 Part of the 101 LINQ SAMPLES
Learn how to use LINQ in your applications with these code samples, covering the entire range of LINQ functionality and demonstrating LINQ with SQL, DataSets, and XML.

Introduction

This sample shows different uses of Aggregate Operators:

Building the Sample

  1. Open the Program.cs
  2. Comment or uncomment the desired samples
  3. Press Ctrl + F5

Description

Count - Simple  

(back to top)

This sample uses Count to get the number of unique factors of 300.

C#
Edit|Remove
public void Linq73() 
{ 
    int[] factorsOf300 = { 22355 }; 
  
    int uniqueFactors = factorsOf300.Distinct().Count(); 
  
    Console.WriteLine("There are {0} unique factors of 300.", uniqueFactors); 
}
 Result

There are 3 unique factors of 300.

Count - Conditional

(back to top)

This sample uses Count to get the number of odd ints in the array.

C#
Edit|Remove
public void Linq74() 
{ 
    int[] numbers = { 5413986720 }; 
  
    int oddNumbers = numbers.Count(n => n % 2 == 1); 
  
    Console.WriteLine("There are {0} odd numbers in the list.", oddNumbers); 
}

Result

There are 5 odd numbers in the list.

Count - Nested

(back to top)

This sample uses Count to return a list of customers and how many orders each has.

C#
Edit|Remove
public void Linq76() 
{ 
    List<Customer> customers = GetCustomerList(); 
  
    var orderCounts = 
        from c in customers 
        select new { c.CustomerID, OrderCount = c.Orders.Count() }; 
  
    ObjectDumper.Write(orderCounts); 
}
Result
CustomerID=ALFKI
CustomerID=ANATR
CustomerID=ANTON
CustomerID=AROUT
CustomerID=BERGS
CustomerID=BLAUS
CustomerID=BLONP
CustomerID=BOLID
CustomerID=BONAP
CustomerID=BOTTM
CustomerID=BSBEV
CustomerID=CACTU
CustomerID=CENTC
CustomerID=CHOPS
CustomerID=COMMI
CustomerID=CONSH
CustomerID=DRACD
CustomerID=DUMON
CustomerID=EASTC
CustomerID=ERNSH
CustomerID=FAMIA
CustomerID=FISSA
CustomerID=FOLIG
CustomerID=FOLKO
CustomerID=FRANK
CustomerID=FRANR
CustomerID=FRANS
CustomerID=FURIB
CustomerID=GALED
CustomerID=GODOS
CustomerID=GOURL
CustomerID=GREAL
CustomerID=GROSR
CustomerID=HANAR
CustomerID=HILAA
CustomerID=HUNGC
CustomerID=HUNGO
CustomerID=ISLAT
CustomerID=KOENE
CustomerID=LACOR
CustomerID=LAMAI
CustomerID=LAUGB
CustomerID=LAZYK
CustomerID=LEHMS
CustomerID=LETSS
CustomerID=LILAS
CustomerID=LINOD
CustomerID=LONEP
CustomerID=MAGAA
CustomerID=MAISD
CustomerID=MEREP
CustomerID=MORGK
CustomerID=NORTS
CustomerID=OCEAN
CustomerID=OLDWO
CustomerID=OTTIK
CustomerID=PARIS
CustomerID=PERIC
CustomerID=PICCO
CustomerID=PRINI
CustomerID=QUEDE
CustomerID=QUEEN
CustomerID=QUICK
CustomerID=RANCH
CustomerID=RATTC
CustomerID=REGGC
CustomerID=RICAR
CustomerID=RICSU
CustomerID=ROMEY
CustomerID=SANTG
CustomerID=SAVEA
CustomerID=SEVES
CustomerID=SIMOB
CustomerID=SPECD
CustomerID=SPLIR
CustomerID=SUPRD
CustomerID=THEBI
CustomerID=THECR
CustomerID=TOMSP
CustomerID=TORTU
CustomerID=TRADH
CustomerID=TRAIH
CustomerID=VAFFE
CustomerID=VICTE
CustomerID=VINET
CustomerID=WANDK
CustomerID=WARTH
CustomerID=WELLI
CustomerID=WHITC
CustomerID=WILMK
CustomerID=WOLZA
OrderCount=6
OrderCount=4
OrderCount=7
OrderCount=13
OrderCount=18
OrderCount=7
OrderCount=11
OrderCount=3
OrderCount=17
OrderCount=14
OrderCount=10
OrderCount=6
OrderCount=1
OrderCount=8
OrderCount=5
OrderCount=3
OrderCount=6
OrderCount=4
OrderCount=8
OrderCount=30
OrderCount=7
OrderCount=0
OrderCount=5
OrderCount=19
OrderCount=15
OrderCount=3
OrderCount=6
OrderCount=8
OrderCount=5
OrderCount=10
OrderCount=9
OrderCount=11
OrderCount=2
OrderCount=14
OrderCount=18
OrderCount=5
OrderCount=19
OrderCount=10
OrderCount=14
OrderCount=4
OrderCount=14
OrderCount=3
OrderCount=2
OrderCount=15
OrderCount=4
OrderCount=14
OrderCount=12
OrderCount=8
OrderCount=10
OrderCount=7
OrderCount=13
OrderCount=5
OrderCount=3
OrderCount=5
OrderCount=10
OrderCount=9
OrderCount=0
OrderCount=6
OrderCount=10
OrderCount=6
OrderCount=9
OrderCount=13
OrderCount=28
OrderCount=5
OrderCount=18
OrderCount=12
OrderCount=11
OrderCount=10
OrderCount=5
OrderCount=6
OrderCount=31
OrderCount=9
OrderCount=7
OrderCount=4
OrderCount=9
OrderCount=12
OrderCount=4
OrderCount=3
OrderCount=5
OrderCount=10
OrderCount=7
OrderCount=3
OrderCount=11
OrderCount=10
OrderCount=4
OrderCount=10
OrderCount=15
OrderCount=9
OrderCount=14
OrderCount=8
OrderCount=7

 

Count - Grouped

(back to top)

This sample uses Count to return a list of categories and how many products each has.

C#
Edit|Remove
public void Linq77() 
{ 
    List<Product> products = GetProductList(); 
  
    var categoryCounts = 
        from p in products 
        group p by p.Category into g 
        select new { Category = g.Key, ProductCount = g.Count() }; 
  
    ObjectDumper.Write(categoryCounts 
}
Result
Category=Beverages
Category=Condiments
Category=Produce
Category=Meat/Poultry
Category=Seafood
Category=Dairy Products
Category=Confections
Category=Grains/Cereals
ProductCount=12
ProductCount=12
ProductCount=5
ProductCount=6
ProductCount=12
ProductCount=10
ProductCount=13
ProductCount=7

 

Sum - Simple

(back to top)

This sample uses Sum to get the total of the numbers in an array.

C#
Edit|Remove
public void Linq78() 
{ 
    int[] numbers = { 5413986720 }; 
  
    double numSum = numbers.Sum(); 
  
    Console.WriteLine("The sum of the numbers is {0}.", numSum); 
}
 Result

The sum of the numbers is 45.

Sum - Projection

(back to top)

This sample uses Sum to get the total number of characters of all words in the array.

C#
Edit|Remove
public void Linq79() 
{ 
    string[] words = { "cherry""apple""blueberry" }; 
  
    double totalChars = words.Sum(w => w.Length); 
  
    Console.WriteLine("There are a total of {0} characters in these words.", totalChars); 
}
Result

There are a total of 20 characters in these words.

Sum - Grouped

(back to top)

This sample uses Sum to get the total units in stock for each product category.

C#
Edit|Remove
public void Linq80() 
{ 
    List<Product> products = GetProductList(); 
  
    var categories = 
        from p in products 
        group p by p.Category into g 
        select new { Category = g.Key, TotalUnitsInStock = g.Sum(p => p.UnitsInStock) }; 
  
    ObjectDumper.Write(categories); 
}
Result
Category=Beverages
Category=Condiments
Category=Produce
Category=Meat/Poultry
Category=Seafood
Category=Dairy Products
Category=Confections
Category=Grains/Cereals
TotalUnitsInStock=559
TotalUnitsInStock=507
TotalUnitsInStock=100
TotalUnitsInStock=165
TotalUnitsInStock=701
TotalUnitsInStock=393
TotalUnitsInStock=386
TotalUnitsInStock=308

 

Min - Simple

(back to top)

This sample uses Min to get the lowest number in an array.

C#
Edit|Remove
public void Linq81() 
{ 
    int[] numbers = { 5413986720 }; 
  
    int minNum = numbers.Min(); 
  
    Console.WriteLine("The minimum number is {0}.", minNum); 
}
Result

The minimum number is 0.

 

Min - Projection

(back to top)

This sample uses Min to get the length of the shortest word in an array.

C#
Edit|Remove
public void Linq82() 
{ 
    string[] words = { "cherry""apple""blueberry" }; 
  
    int shortestWord = words.Min(w => w.Length); 
  
    Console.WriteLine("The shortest word is {0} characters long.", shortestWord); 
}
Result

The shortest word is 5 characters long.

Min - Grouped

(back to top)

This sample uses Min to get the cheapest price among each category's products.

C#
Edit|Remove
public void Linq83() 
{ 
    List<Product> products = GetProductList(); 
  
    var categories = 
        from p in products 
        group p by p.Category into g 
        select new { Category = g.Key, CheapestPrice = g.Min(p => p.UnitPrice) }; 
  
    ObjectDumper.Write(categories); 
}
Result
Category=Beverages
Category=Condiments
Category=Produce
Category=Meat/Poultry
Category=Seafood
Category=Dairy Products
Category=Confections
Category=Grains/Cereals
CheapestPrice=4.5000
CheapestPrice=10.0000
CheapestPrice=10.0000
CheapestPrice=7.4500
CheapestPrice=6.0000
CheapestPrice=2.5000
CheapestPrice=9.2000
CheapestPrice=7.0000

 

Min - Elements

(back to top)

This sample uses Min to get the products with the cheapest price in each category.

C#
Edit|Remove
public void Linq84() 
{ 
    List<Product> products = GetProductList(); 
  
    var categories = 
        from p in products 
        group p by p.Category into g 
        let minPrice = g.Min(p => p.UnitPrice) 
        select new { Category = g.Key, CheapestProducts = g.Where(p => p.UnitPrice == minPrice) }; 
  
    ObjectDumper.Write(categories, 1); 
}
Result

Category=Beverages      CheapestProducts=...
  CheapestProducts: ProductID=24  ProductName=Guaraná Fantástica  Category=Beverages      UnitPrice=4.5000        UnitsInStock=20
Category=Condiments    CheapestProducts=...
  CheapestProducts: ProductID=3  ProductName=Aniseed Syrup      Category=Condiments    UnitPrice=10.0000      UnitsInStock=13
Category=Produce        CheapestProducts=...
  CheapestProducts: ProductID=74  ProductName=Longlife Tofu      Category=Produce        UnitPrice=10.0000      UnitsInStock=4
Category=Meat/Poultry  CheapestProducts=...
  CheapestProducts: ProductID=54  ProductName=Tourtière  Category=Meat/Poultry  UnitPrice=7.4500        UnitsInStock=21
Category=Seafood        CheapestProducts=...
  CheapestProducts: ProductID=13  ProductName=Konbu      Category=Seafood        UnitPrice=6.0000        UnitsInStock=24
Category=Dairy Products        CheapestProducts=...
  CheapestProducts: ProductID=33  ProductName=Geitost    Category=Dairy Products        UnitPrice=2.5000        UnitsInStock=112
Category=Confections    CheapestProducts=...
  CheapestProducts: ProductID=19  ProductName=Teatime Chocolate Biscuits  Category=Confections    UnitPrice=9.2000        UnitsInStock=25
Category=Grains/Cereals        CheapestProducts=...
  CheapestProducts: ProductID=52  ProductName=Filo Mix    Category=Grains/Cereals        UnitPrice=7.0000        UnitsInStock=38

Max - Simple

(back to top)

This sample uses Max to get the highest number in an array.

C#
Edit|Remove
public void Linq85() 
{ 
    int[] numbers = { 5413986720 }; 
  
    int maxNum = numbers.Max(); 
  
    Console.WriteLine("The maximum number is {0}.", maxNum); 
}
Result

The maximum number is 9.

Max - Projection

(back to top)

This sample uses Max to get the length of the longest word in an array.

C#
Edit|Remove
public void Linq86() 
{ 
    string[] words = { "cherry""apple""blueberry" }; 
  
    int longestLength = words.Max(w => w.Length); 
  
    Console.WriteLine("The longest word is {0} characters long.", longestLength); 
}
Result

The longest word is 9 characters long.

Max - Grouped

(back to top)

This sample uses Max to get the most expensive price among each category's products.

C#
Edit|Remove
public void Linq87() 
{ 
    List<Product> products = GetProductList(); 
  
    var categories = 
        from p in products 
        group p by p.Category into g 
        select new { Category = g.Key, MostExpensivePrice = g.Max(p => p.UnitPrice) }; 
  
    ObjectDumper.Write(categories); 
}
Result
Category=Beverages
Category=Condiments
Category=Produce
Category=Meat/Poultry
Category=Seafood
Category=Dairy Products
Category=Confections
Category=Grains/Cereals
MostExpensivePrice=263.5000
MostExpensivePrice=43.9000
MostExpensivePrice=53.0000
MostExpensivePrice=123.7900
MostExpensivePrice=62.5000
MostExpensivePrice=55.0000
MostExpensivePrice=81.0000
MostExpensivePrice=38.0000

 

Max - Elements

(back to top)

This sample uses Max to get the products with the most expensive price in each category.

C#
Edit|Remove
public void Linq88() 
{ 
    List<Product> products = GetProductList(); 
  
    var categories = 
        from p in products 
        group p by p.Category into g 
        let maxPrice = g.Max(p => p.UnitPrice) 
        select new { Category = g.Key, MostExpensiveProducts = g.Where(p => p.UnitPrice == maxPrice) }; 
  
    ObjectDumper.Write(categories, 1); 
}
Result

Category=Beverages      MostExpensiveProducts=...
  MostExpensiveProducts: ProductID=38    ProductName=Côte de Blaye      Category=Beverages      UnitPrice=263.5000      UnitsInStock=17
Category=Condiments    MostExpensiveProducts=...
  MostExpensiveProducts: ProductID=63    ProductName=Vegie-spread        Category=Condiments    UnitPrice=43.9000      UnitsInStock=24
Category=Produce        MostExpensiveProducts=...
  MostExpensiveProducts: ProductID=51    ProductName=Manjimup Dried Apples      Category=Produce        UnitPrice=53.0000      UnitsInStock=20
Category=Meat/Poultry  MostExpensiveProducts=...
  MostExpensiveProducts: ProductID=29    ProductName=Thüringer Rostbratwurst    Category=Meat/Poultry  UnitPrice=123.7900      UnitsInStock=0
Category=Seafood        MostExpensiveProducts=...
  MostExpensiveProducts: ProductID=18    ProductName=Carnarvon Tigers    Category=Seafood        UnitPrice=62.5000      UnitsInStock=42
Category=Dairy Products        MostExpensiveProducts=...
  MostExpensiveProducts: ProductID=59    ProductName=Raclette Courdavault        Category=Dairy Products        UnitPrice=55.0000      UnitsInStock=79
Category=Confections    MostExpensiveProducts=...
  MostExpensiveProducts: ProductID=20    ProductName=Sir Rodney's Marmalade      Category=Confections    UnitPrice=81.0000      UnitsInStock=40
Category=Grains/Cereals        MostExpensiveProducts=...
  MostExpensiveProducts: ProductID=56    ProductName=Gnocchi di nonna Alice      Category=Grains/Cereals        UnitPrice=38.0000      UnitsInStock=21

Average - Simple

(back to top)

This sample uses Average to get the average of all numbers in an array.

C#
Edit|Remove
public void Linq89() 
{ 
    int[] numbers = { 5413986720 }; 
  
    double averageNum = numbers.Average(); 
  
    Console.WriteLine("The average number is {0}.", averageNum); 
}
Result

The average number is 4.5.

 

Average - Projection

(back to top)

This sample uses Average to get the average length of the words in the array.

C#
Edit|Remove
public void Linq90() 
{ 
    string[] words = { "cherry""apple""blueberry" }; 
  
    double averageLength = words.Average(w => w.Length); 
  
    Console.WriteLine("The average word length is {0} characters.", averageLength); 
}
Result

The average word length is 6.66666666666667 characters.

Average - Grouped

(back to top)

This sample uses Average to get the average price of each category's products.

C#
Edit|Remove
public void Linq91() 
{ 
    List<Product> products = GetProductList(); 
  
    var categories = 
        from p in products 
        group p by p.Category into g 
        select new { Category = g.Key, AveragePrice = g.Average(p => p.UnitPrice) }; 
  
    ObjectDumper.Write(categories); 
}

Result

Category=Beverages
Category=Condiments
Category=Produce
Category=Meat/Poultry
Category=Seafood
Category=Dairy Products
Category=Confections
Category=Grains/Cereals
AveragePrice=37.979166666666666666666666667
AveragePrice=23.0625
AveragePrice=32.3700
AveragePrice=54.006666666666666666666666667
AveragePrice=20.6825
AveragePrice=28.7300
AveragePrice=25.1600
AveragePrice=20.2500

 

Aggregate - Simple

(back to top)

This sample uses Aggregate to create a running product on the array that calculates the total product of all elements.

C#
Edit|Remove
public void Linq92() 
{ 
    double[] doubles = { 1.72.31.94.12.9 }; 
  
    double product = doubles.Aggregate((runningProduct, nextFactor) => runningProduct * nextFactor); 
  
    Console.WriteLine("Total product of all numbers: {0}", product); 
}

Result

Total product of all numbers: 88.33081

Aggregate - Seed

(back to top)

This sample uses Aggregate to create a running account balance that subtracts each withdrawal from the initial balance of 100, as long as the balance never drops below 0.

C#
Edit|Remove
public void Linq93() 
{ 
    double startBalance = 100.0; 
  
    int[] attemptedWithdrawals = { 20104050107030 }; 
  
    double endBalance = 
        attemptedWithdrawals.Aggregate(startBalance, 
            (balance, nextWithdrawal) => 
                ((nextWithdrawal <= balance) ? (balance - nextWithdrawal) : balance)); 
  
    Console.WriteLine("Ending balance: {0}", endBalance); 
}

Result

Ending balance: 20

 

Source Code Files

101 LINQ Samples

More Information

For more information, see: