Colecciones
## Objetivos de Aprendizaje
- Trabajar con arreglos
- Usar List, Dictionary, HashSet
- Dominar fundamentos de LINQ
- Comprender interfaces de colecciones
## Arreglos
### Declaración e Inicialización
```csharp
int[] numbers = { 1, 2, 3, 4, 5 };
string[] names = new string[3];
int[] scores = new int[] { 90, 85, 77 };
```
### Acceder a Elementos
```csharp
int[] numbers = { 10, 20, 30, 40, 50 };
Console.WriteLine(numbers[0]); // 10
Console.WriteLine(numbers[4]); // 50
numbers[2] = 35; // Modificar elemento
```
### Propiedades y Métodos de Arreglos
```csharp
int[] numbers = { 5, 2, 8, 1, 9, 3 };
Console.WriteLine(numbers.Length); // 6
Console.WriteLine(numbers.Rank); // 1
Array.Sort(numbers); // Ordenar en su lugar
Array.Reverse(numbers); // Invertir en su lugar
int index = Array.IndexOf(numbers, 8); // 2
```
### Arreglos Multidimensionales
```csharp
// Arreglo rectangular
int[,] matrix = {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
Console.WriteLine(matrix[0, 0]); // 1
Console.WriteLine(matrix[2, 2]); // 9
// Arreglo dentado
int[][] jagged = new int[3][];
jagged[0] = new int[] { 1, 2 };
jagged[1] = new int[] { 3, 4, 5 };
jagged[2] = new int[] { 6 };
```
### Métodos de Arreglos
```csharp
int[] a = { 1, 2, 3 };
int[] b = { 1, 2, 3 };
int[] c = a; // Misma referencia
Console.WriteLine(a == b); // False (arreglos diferentes)
Console.WriteLine(a == c); // True (misma referencia)
```
## List
### Arreglos Dinámicos
```csharp
using System.Collections.Generic;
List names = new List();
names.Add("Alice");
names.Add("Bob");
names.Add("Charlie");
// Inicializar con valores
List numbers = new List { 1, 2, 3, 4, 5 };
Console.WriteLine(numbers.Count); // 5
Console.WriteLine(numbers[2]); // 3
```
### Operaciones de List
```csharp
List numbers = new List { 1, 2, 3 };
numbers.Add(4); // Agregar al final
numbers.Insert(0, 0); // Insertar en índice
numbers.Remove(2); // Remover primer 2
numbers.RemoveAt(0); // Remover en índice
numbers.Contains(3); // true
numbers.IndexOf(3); // 2
numbers.Clear(); // Remover todos
numbers.Count; // 0
```
## Dictionary
### Pares Clave-Valor
```csharp
Dictionary ages = new Dictionary();
ages.Add("Alice", 25);
ages.Add("Bob", 30);
// Inicializar
Dictionary ages2 = new Dictionary
{
{ "Alice", 25 },
{ "Bob", 30 }
};
Console.WriteLine(ages["Alice"]); // 25
```
### Operaciones de Dictionary
```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
// Iterar
foreach (KeyValuePair kvp in ages)
{
Console.WriteLine($"{kvp.Key}: {kvp.Value}");
}
// Claves y Valores
foreach (string key in ages.Keys)
{
Console.WriteLine(key);
}
```
## HashSet
### Elementos Únicos
```csharp
HashSet names = new HashSet();
names.Add("Alice");
names.Add("Bob");
names.Add("Alice"); // Sin efecto - duplicado
Console.WriteLine(names.Count); // 2
Console.WriteLine(names.Contains("Alice")); // true
```
### Operaciones de Conjuntos
```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 y Stack
### FIFO y LIFO
```csharp
// Queue - Primero en Entrar, Primero en Salir
Queue queue = new Queue();
queue.Enqueue("Primero");
queue.Enqueue("Segundo");
queue.Enqueue("Tercero");
Console.WriteLine(queue.Dequeue()); // Primero
Console.WriteLine(queue.Peek()); // Segundo
// Stack - Último en Entrar, Primero en Salir
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)
### Sintaxis de Consulta
```csharp
using System.Linq;
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// Sintaxis de consulta
var evens = from n in numbers
where n % 2 == 0
select n;
// Sintaxis de método
var evens2 = numbers.Where(n => n % 2 == 0);
```
### Métodos Comunes de LINQ
```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); // Ordenado
numbers.OrderByDescending(n => n); // Descendente
numbers.First(); // 5
numbers.First(n => n > 3); // 5
numbers.Last(); // 7
numbers.Skip(3); // Saltar primeros 3
numbers.Take(3); // Tomar primeros 3
numbers.Distinct(); // Valores únicos
numbers.Reverse(); // Invertido
```
### Ejemplos de LINQ
```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);
// Múltiples condiciones
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($"Edad {group.Key}:");
foreach (var person in group)
{
Console.WriteLine($" {person.Name}");
}
}
```
### Palabra Clave Let
```csharp
var names = new[] { "Alice", "Bob", "Charlie" };
var result = from name in names
let upper = name.ToUpper()
where upper.StartsWith("A")
select upper;
```
## Interfaces de Colecciones
### IEnumerable vs ICollection vs IList
| Interfaz | Descripción |
|----------|-------------|
| IEnumerable | Puede enumerar (foreach) |
| ICollection | Agregar/Remover, Count |
| IList | Acceso por índice, Ordenar |
### Elegir Colecciones
| Colección | Usar Cuando |
|-----------|-------------|
| List | Ordenado, acceso por índice, duplicados |
| Dictionary | Pares clave-valor, búsqueda rápida |
| HashSet | Elementos únicos, operaciones de conjuntos |
| Queue | Procesamiento FIFO |
| Stack | Procesamiento LIFO |
| LinkedList | Inserción/eliminación frecuente |
## Arreglo vs List
```csharp
// Arreglo - tamaño fijo, más rápido para acceso por índice
int[] array = new int[1000];
array[500] = 42; // Rápido
// List - tamaño dinámico, más flexible
List list = new List();
list.Add(42); // Crece según necesidad
list[0] = 42; // Ligeramente más lento que arreglo
```
## Resumen
- Arreglos: tamaño fijo, acceso rápido por índice
- List: arreglo dinámico, colección más común
- Dictionary: pares clave-valor, búsqueda O(1)
- HashSet: elementos únicos, operaciones de conjuntos
- Queue: FIFO; Stack: LIFO
- LINQ: capacidades potentes de consulta
- Sintaxis de consulta: `from...where...select`
- Sintaxis de método: `Where()`, `Select()`, `OrderBy()`
Comments
Comments powered by Giscus
To enable comments, add your Giscus embed code here.
Learn more about Giscus →