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 →