LINQ
Language Integrated Query (LINQ) lets you query collections using expressive, SQL-like syntax directly in C#. It works on arrays, lists, dictionaries, and any IEnumerable<T>.
Method Syntax (Fluent)
var products = new List<Product>
{
new("Laptop", 999, "Electronics"),
new("Book", 15, "Education"),
new("Phone", 699, "Electronics"),
new("Pen", 2, "Office"),
new("Tablet", 449, "Electronics")
};
// Filter
var expensive = products.Where(p => p.Price > 100);
// Transform
var names = products.Select(p => p.Name);
// Sort
var sorted = products.OrderBy(p => p.Price);
var desc = products.OrderByDescending(p => p.Price);
// Aggregate
int count = products.Count(p => p.Category == "Electronics"); // 3
double avg = products.Average(p => p.Price); // 432.8
double total = products.Sum(p => p.Price); // 2164
Chaining Operations
var result = products
.Where(p => p.Category == "Electronics")
.OrderBy(p => p.Price)
.Select(p => $"{p.Name}: ${p.Price}")
.ToList();
// ["Tablet: $449", "Phone: $699", "Laptop: $999"]
Common Operators
products.First(p => p.Price < 10); // Pen
products.FirstOrDefault(p => p.Price > 5000); // null
products.Any(p => p.Price > 500); // true
products.All(p => p.Price > 0); // true
products.Distinct(); // unique items
products.Take(3); // first 3
products.Skip(2); // skip first 2
GroupBy
var groups = products.GroupBy(p => p.Category);
foreach (var group in groups)
{
Console.WriteLine($"{group.Key}: {group.Count()} items");
}
// Electronics: 3 items
// Education: 1 items
// Office: 1 items
Deferred Execution
LINQ queries are lazy — they don't execute until you iterate or call a terminal method (ToList, Count, First):
var query = products.Where(p => p.Price > 100); // not executed yet
var list = query.ToList(); // NOW it executes