After this lesson, you will be able to: Use LINQ method syntax to filter, map, sort, group, and aggregate collections.
LINQ is C#'s killer feature. Once you're fluent, you'll write 5x less collection-manipulation code than in Java or pre-streams JS.
Functional pipelines on IEnumerable<T>.
using System.Linq;var nums = new[] { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5 };// Where: filtervar evens = nums.Where(n => n % 2 == 0); // 4, 2, 6// Select: mapvar squared = nums.Select(n => n * n); // 9, 1, 16, ...// OrderBy: sortvar sorted = nums.OrderBy(n => n); // 1, 1, 2, 3, 3, ...var descending = nums.OrderByDescending(n => n);// Distinct, Take, Skipvar unique = nums.Distinct(); // 3, 1, 4, 5, 9, 2, 6var firstFive = nums.Take(5);var afterFive = nums.Skip(5);// Aggregationsint sum = nums.Sum();int max = nums.Max();double avg = nums.Average();int count = nums.Count(n => n > 3);// First, Single, Any, Allint first = nums.First(n => n > 4); // throws if no matchint? firstOrNull = nums.FirstOrDefault(n => n > 100); // 0 (default) if no matchbool any = nums.Any(n => n > 8);bool all = nums.All(n => n < 10);
GroupBy + Join, like SQL.
var users = new[] {new { Name = "Alex", Dept = "Eng" },new { Name = "Sam", Dept = "Sales" },new { Name = "Jordan", Dept = "Eng" },};// Group by departmentvar byDept = users.GroupBy(u => u.Dept).Select(g => new { Dept = g.Key, Count = g.Count(), Names = g.Select(u => u.Name) });foreach (var group in byDept) {Console.WriteLine($"{group.Dept}: {group.Count} ({string.Join(", ", group.Names)})");}// Join (like SQL inner join)var depts = new[] {new { Code = "Eng", Label = "Engineering" },new { Code = "Sales", Label = "Sales" },};var joined = users.Join(depts,user => user.Dept,dept => dept.Code,(user, dept) => new { user.Name, dept.Label });
LINQ is LAZY by default. Queries don't run until enumerated.
var query = nums.Where(n => {Console.WriteLine($"checking {n}");return n > 3;});// Nothing printed yet!foreach (var n in query) { // NOW the lambda runsConsole.WriteLine($"got {n}");}// Convert to list to force immediate execution + cachevar evaluated = query.ToList(); // runs once nowvar evaluated2 = query.ToArray(); // runs once now
Forgetting deferred execution → enumerating a query twice (runs DB queries twice in LINQ-to-SQL). ToList() too eagerly (loses laziness benefit). First() instead of FirstOrDefault() (throws when you didn't expect). Mixing query and method syntax in one expression (readable mess).
Sign in and purchase access to unlock this lesson.