← C# EnglishChapter 08 of 13

Collections

## Learning Objectives - Work with arrays - Use List, Dictionary, HashSet - Master LINQ basics - Understand collection interfaces ## Arrays ### Declaration and Initialization ```csharp int[] numbers = { 1, 2, 3, 4, 5 }; string[] names = new string[3]; int[] scores = new int[] { 90, 85, 77 }; ``` ### Accessing Elements ```csharp int[] numbers = { 10, 20, 30, 40, 50 }; Console.WriteLine(numbers[0]); // 10 Console.WriteLine(numbers[4]); // 50 numbers[2] = 35; // Modify element ``` ### Array Properties and Methods ```csharp int[] numbers = { 5, 2, 8, 1, 9, 3 }; Console.WriteLine(numbers.Length); // 6 Console.WriteLine(numbers Rank); // 1 Array.Sort(numbers); // Sort in place Array.Reverse(numbers); // Reverse in place int index = Array.IndexOf(numbers, 8); // 2 ``` ### Multi-Dimensional Arrays ```csharp // Rectangular array int[,] matrix = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; Console.WriteLine(matrix[0, 0]); // 1 Console.WriteLine(matrix[2, 2]); // 9 // Jagged array int[][] jagged = new int[3][]; jagged[0] = new int[] { 1, 2 }; jagged[1] = new int[] { 3, 4, 5 }; jagged[2] = new int[] { 6 }; ``` ### Array Methods ```csharp int[] a = { 1, 2, 3 }; int[] b = { 1, 2, 3 }; int[] c = a; // Same reference Console.WriteLine(a == b); // False (different arrays) Console.WriteLine(a == c); // True (same reference) ``` ## List ### Dynamic Arrays ```csharp using System.Collections.Generic; List names = new List(); names.Add("Alice"); names.Add("Bob"); names.Add("Charlie"); // Initialize with values List numbers = new List { 1, 2, 3, 4, 5 }; Console.WriteLine(numbers.Count); // 5 Console.WriteLine(numbers[2]); // 3 ``` ### List Operations ```csharp List numbers = new List { 1, 2, 3 }; numbers.Add(4); // Add to end numbers.Insert(0, 0); // Insert at index numbers.Remove(2); // Remove first 2 numbers.RemoveAt(0); // Remove at index numbers.Contains(3); // true numbers.IndexOf(3); // 2 numbers.Clear(); // Remove all numbers.Count; // 0 ``` ## Dictionary ### Key-Value Pairs ```csharp Dictionary ages = new Dictionary(); ages.Add("Alice", 25); ages.Add("Bob", 30); // Initialize Dictionary ages2 = new Dictionary { { "Alice", 25 }, { "Bob", 30 } }; Console.WriteLine(ages["Alice"]); // 25 ``` ### Dictionary Operations ```csharp Dictionary ages = new Dictionary { { "Alice", 25 }, { "Bob", 30 } }; ages.ContainsKey("Alice"); // true ages.TryGetValue("Charlie", out int age); // false ages.Remove("Bob"); ages.Count; // 1 // Iterate foreach (KeyValuePair kvp in ages) { Console.WriteLine($"{kvp.Key}: {kvp.Value}"); } // Keys and Values foreach (string key in ages.Keys) { Console.WriteLine(key); } ``` ## HashSet ### Unique Elements ```csharp HashSet names = new HashSet(); names.Add("Alice"); names.Add("Bob"); names.Add("Alice"); // No effect - duplicate Console.WriteLine(names.Count); // 2 Console.WriteLine(names.Contains("Alice")); // true ``` ### Set Operations ```csharp HashSet set1 = { 1, 2, 3, 4, 5 }; HashSet set2 = { 4, 5, 6, 7, 8 }; set1.UnionWith(set2); // { 1, 2, 3, 4, 5, 6, 7, 8 } set1.IntersectWith(set2); // { 4, 5 } set1.ExceptWith(set2); // { 1, 2, 3 } ``` ## Queue and Stack ### FIFO and LIFO ```csharp // Queue - First In, First Out Queue queue = new Queue(); queue.Enqueue("First"); queue.Enqueue("Second"); queue.Enqueue("Third"); Console.WriteLine(queue.Dequeue()); // First Console.WriteLine(queue.Peek()); // Second // Stack - Last In, First Out Stack stack = new Stack(); stack.Push(1); stack.Push(2); stack.Push(3); Console.WriteLine(stack.Pop()); // 3 Console.WriteLine(stack.Peek()); // 2 ``` ## LINQ (Language Integrated Query) ### Query Syntax ```csharp using System.Linq; int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // Query syntax var evens = from n in numbers where n % 2 == 0 select n; // Method syntax var evens2 = numbers.Where(n => n % 2 == 0); ``` ### Common LINQ Methods ```csharp int[] numbers = { 5, 2, 8, 1, 9, 3, 7 }; numbers.Count(); // 7 numbers.Sum(); // 35 numbers.Average(); // 5 numbers.Max(); // 9 numbers.Min(); // 1 numbers.OrderBy(n => n); // Sorted numbers.OrderByDescending(n => n); // Descending numbers.First(); // 5 numbers.First(n => n > 3); // 5 numbers.Last(); // 7 numbers.Skip(3); // Skip first 3 numbers.Take(3); // Take first 3 numbers.Distinct(); // Unique values numbers.Reverse(); // Reversed ``` ### LINQ Examples ```csharp class Person { public string Name { get; set; } public int Age { get; set; } } List people = new List { new Person { Name = "Alice", Age = 25 }, new Person { Name = "Bob", Age = 30 }, new Person { Name = "Charlie", Age = 25 } }; // Where var adults = people.Where(p => p.Age >= 18); // Select var names = people.Select(p => p.Name); // OrderBy var sorted = people.OrderBy(p => p.Age); // Multiple conditions var result = people .Where(p => p.Age > 20) .OrderByDescending(p => p.Age) .Select(p => new { p.Name, p.Age }); // GroupBy var byAge = people.GroupBy(p => p.Age); foreach (var group in byAge) { Console.WriteLine($"Age {group.Key}:"); foreach (var person in group) { Console.WriteLine($" {person.Name}"); } } ``` ### Let Keyword ```csharp var names = new[] { "Alice", "Bob", "Charlie" }; var result = from name in names let upper = name.ToUpper() where upper.StartsWith("A") select upper; ``` ## Collection Interfaces ### IEnumerable vs ICollection vs IList | Interface | Description | |-----------|-------------| | IEnumerable | Can enumerate (foreach) | | ICollection | Add/Remove, Count | | IList | Index access, Sort | ### Choosing Collections | Collection | Use When | |-----------|----------| | List | Ordered, indexed access, duplicates | | Dictionary | Key-value pairs, fast lookup | | HashSet | Unique elements, set operations | | Queue | FIFO processing | | Stack | LIFO processing | | LinkedList | Frequent insert/delete | ## Array vs List ```csharp // Array - fixed size, faster for indexed access int[] array = new int[1000]; array[500] = 42; // Fast // List - dynamic size, more flexible List list = new List(); list.Add(42); // Grows as needed list[0] = 42; // Slightly slower than array ``` ## Summary - Arrays: fixed size, fast indexed access - List: dynamic array, most common collection - Dictionary: key-value pairs, O(1) lookup - HashSet: unique elements, set operations - Queue: FIFO; Stack: LIFO - LINQ: powerful query capabilities - Query syntax: `from...where...select` - Method syntax: `Where()`, `Select()`, `OrderBy()`

Comments

Comments powered by Giscus

To enable comments, add your Giscus embed code here.

Learn more about Giscus →