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