How to find minimum value in a collection using linq?
Categories:
Finding the Minimum Value in C# Collections with LINQ

Discover how to efficiently retrieve the minimum value from various C# collections using Language Integrated Query (LINQ), covering common scenarios and best practices.
LINQ (Language Integrated Query) provides a powerful and concise way to query and manipulate data in C#. When working with collections, a common task is to find the smallest element. LINQ offers several methods to achieve this, catering to different data types and scenarios. This article will guide you through using the Min()
extension method effectively, from simple numeric arrays to complex object collections.
Basic Usage of Min()
for Numeric Collections
The Min()
extension method is straightforward to use with collections of numeric types such as int
, double
, decimal
, etc. It iterates through the collection and returns the smallest value found. If the collection is empty, Min()
will throw an InvalidOperationException
for non-nullable types, or return null
for nullable types.
using System;
using System.Linq;
using System.Collections.Generic;
public class MinExample
{
public static void Main(string[] args)
{
// Example 1: Array of integers
int[] numbers = { 5, 2, 8, 1, 9, 3 };
int minNumber = numbers.Min();
Console.WriteLine($"Minimum integer: {minNumber}"); // Output: 1
// Example 2: List of doubles
List<double> temperatures = new List<double> { 23.5, 18.2, 25.1, 17.9, 20.0 };
double minTemperature = temperatures.Min();
Console.WriteLine($"Minimum temperature: {minTemperature}"); // Output: 17.9
// Example 3: Empty collection (throws exception)
List<int> emptyList = new List<int>();
try
{
// int minEmpty = emptyList.Min(); // This line would throw InvalidOperationException
Console.WriteLine("Attempted to find min in empty list (commented out to prevent crash).");
}
catch (InvalidOperationException ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
Basic usage of Min()
with integer arrays and double lists.
Min()
on potentially empty collections of non-nullable value types. It will throw an InvalidOperationException
. Consider using DefaultIfEmpty()
or checking Any()
first.Finding Minimum in Collections of Objects
When you have a collection of custom objects, you often need to find the minimum based on a specific property of those objects. The Min()
method has an overload that accepts a Func<TSource, TResult>
delegate (a lambda expression) to specify the property to compare. This allows you to project each element to a comparable value before finding the minimum.
using System;
using System.Linq;
using System.Collections.Generic;
public class Product
{
public string Name { get; set; }
public decimal Price { get; set; }
public int Stock { get; set; }
}
public class MinObjectExample
{
public static void Main(string[] args)
{
List<Product> products = new List<Product>
{
new Product { Name = "Laptop", Price = 1200.50m, Stock = 10 },
new Product { Name = "Mouse", Price = 25.99m, Stock = 50 },
new Product { Name = "Keyboard", Price = 75.00m, Stock = 20 },
new Product { Name = "Monitor", Price = 300.00m, Stock = 5 }
};
// Find the minimum price
decimal minPrice = products.Min(p => p.Price);
Console.WriteLine($"Minimum product price: {minPrice:C}"); // Output: $25.99
// Find the minimum stock quantity
int minStock = products.Min(p => p.Stock);
Console.WriteLine($"Minimum product stock: {minStock}"); // Output: 5
// To get the actual product object with the minimum price, use OrderBy and First
Product cheapestProduct = products.OrderBy(p => p.Price).FirstOrDefault();
if (cheapestProduct != null)
{
Console.WriteLine($"Cheapest product: {cheapestProduct.Name} (Price: {cheapestProduct.Price:C})");
}
}
}
Finding minimum price and stock in a list of Product
objects.
flowchart TD A[Start] B{Collection of Items?} C[Is Collection Empty?] D[Use Min() directly] E[Use Min(selector) for property] F[Handle Empty Collection] G[Result: Minimum Value] H[End] A --> B B -->|Yes| C B -->|No| F C -->|Yes| F C -->|No| I{Items are simple numeric types?} I -->|Yes| D I -->|No| E D --> G E --> G F --> G G --> H
Decision flow for finding minimum values in C# collections using LINQ.
Handling Empty Collections Gracefully
As mentioned, Min()
throws an InvalidOperationException
for empty collections of non-nullable types. To prevent this, you can use DefaultIfEmpty()
or check if the collection Any()
elements before calling Min()
.
using System;
using System.Linq;
using System.Collections.Generic;
public class MinEmptyHandling
{
public static void Main(string[] args)
{
List<int> emptyNumbers = new List<int>();
List<double> emptyTemperatures = new List<double>();
// Method 1: Using DefaultIfEmpty()
// For value types, DefaultIfEmpty() will use the default value (e.g., 0 for int, 0.0 for double)
int minOrDefault = emptyNumbers.DefaultIfEmpty().Min();
Console.WriteLine($"Min with DefaultIfEmpty (int): {minOrDefault}"); // Output: 0
double minOrDefaultDouble = emptyTemperatures.DefaultIfEmpty().Min();
Console.WriteLine($"Min with DefaultIfEmpty (double): {minOrDefaultDouble}"); // Output: 0
// You can also specify a default value
int minWithCustomDefault = emptyNumbers.DefaultIfEmpty(-1).Min();
Console.WriteLine($"Min with custom DefaultIfEmpty (int): {minWithCustomDefault}"); // Output: -1
// Method 2: Checking with Any()
if (emptyNumbers.Any())
{
int minAny = emptyNumbers.Min();
Console.WriteLine($"Min with Any() check: {minAny}");
}
else
{
Console.WriteLine("Collection is empty, cannot find min using Any() check.");
}
// For nullable types, Min() returns null for empty collections
List<int?> nullableNumbers = new List<int?>();
int? minNullable = nullableNumbers.Min();
Console.WriteLine($"Min for empty nullable collection: {minNullable ?? -999}"); // Output: -999 (or null if not coalesced)
}
}
Strategies for handling empty collections when finding minimum values.
OrderBy().FirstOrDefault()
or Aggregate()
are often more suitable than Min()
. Min()
only returns the minimum value, not the element it came from.