← C# EspañolChapter 08 of 13

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 →