Trabajar con colecciones genéricas en C# ofrece flexibilidad, tipado fuerte y un flujo de trabajo moderno. Aquí verás cómo migrar de arreglos a List<T>, agregar y quitar elementos con métodos clave, y depurar en Visual Studio Code con confianza. Todo con ejemplos claros y directos.
¿Por qué usar colecciones genéricas en C#?
Las colecciones genéricas permiten definir el tipo de dato que almacenan desde el inicio. Eso evita errores y mejora el rendimiento. Con List<T> puedes agregar, quitar y combinar elementos, algo que con un arreglo fijo no es posible.
Arreglo vs lista: un arreglo tiene tamaño fijo. Una lista crece y reduce dinámicamente.
Genéricos:List<Curso> asegura que solo se guarden objetos Curso.
Espacio de nombres: se requiere using System.Collections.Generic; para acceder a List, Dictionary, HashSet, etc.
Otros tipos útiles: cola (Queue), pila (Stack), Dictionary y HashSet. También hay colecciones especializadas en System.Collections.Specialized y para concurrencia en System.Collections.Concurrent.
Compatibilidad con foreach: recorrer una lista o un arreglo con foreach es equivalente.
IEnumerable clave: una lista es un IEnumerable<Curso>. Casi cualquier colección es enumerable, lo que habilita métodos como agregar rangos.
¿Cómo migrar de arreglos a list en System.Collections.Generic?
Migrar es directo: declaras una List<Curso>, cambias la propiedad de Escuela a lista genérica y reasignas la referencia.
Inicializar una lista tipada.
usingSystem.Collections.Generic;var listaCursos =newList<Curso>{newCurso{ Nombre ="101"},newCurso{ Nombre ="201"},newCurso{ Nombre ="301"}};
foreach(var curso in escuela.Cursos){// Imprimir o procesar cada curso.}
¿Cómo inicializar y asignar a escuela.cursos?
Declara List<Curso> y especifica el tipo Curso entre < >.
Importa el namespaceSystem.Collections.Generic.
Asigna la nueva lista a escuela.Cursos.
Mantén el recorrido con foreach sin cambios.
¿Cómo agregar elementos: add y addrange?
Puedes sumar cursos de forma incremental o en bloque.
Agregar uno a uno con Add.
escuela.Cursos.Add(newCurso{ Nombre ="102", Jornada = TiposJornada.Tarde
});escuela.Cursos.Add(newCurso{ Nombre ="202", Jornada = TiposJornada.Tarde
});
Agregar en bloque con AddRange usando otra colección enumerable.
var otraColeccion =newList<Curso>{newCurso{ Nombre ="401", Jornada = TiposJornada.Mañana },newCurso{ Nombre ="501", Jornada = TiposJornada.Mañana },newCurso{ Nombre ="502", Jornada = TiposJornada.Tarde }};escuela.Cursos.AddRange(otraColeccion);
Notas prácticas.
El unique ID del curso es de solo lectura: se asigna internamente.
Puedes estandarizar reglas simples, por ejemplo: nombres que terminan en "2" con jornada tarde.
¿Cómo eliminar elementos: clear y remove?
La lista también permite limpiar o quitar elementos específicos.
Vaciar una colección completa con Clear.
otraColeccion.Clear();// Remueve todos los elementos.
Quitar un curso concreto con Remove.
// Suponiendo que tienes la referencia al objeto curso a eliminar.escuela.Cursos.Remove(cursoAEliminar);
Remover según condición: existe una opción para "remover todos los que cumplan una condición" sobre la colección de cursos.
¿Cómo depurar y observar colecciones en Visual Studio Code?
Depurar ayuda a verificar contenidos en cada paso. El flujo en VS Code es cómodo y visual.
Ejecuta en consola con dotnet run para validar rápidamente.
Coloca un punto de interrupción y presiona play en el panel de debug.
Observa variables locales en el panel superior.
Usa la ventana watch para inspeccionar otraColeccion y sus elementos.
Avanza paso a paso: pausa, siguiente, adentro, afuera, reiniciar o detener.
Verifica cambios tras Clear: el contador pasa de tres a cero, sin errores.
¿Listo para profundizar en las condiciones de remoción selectiva y más operaciones sobre colecciones? Comparte tus dudas o casos de uso en los comentarios.
Remove(objeto). Elimina el objeto que se le pasa al método
RemoveAll(Predicado). Elimina todos los objetos para los que el predicado devuelva true. El predicado es un método que recibe un elemento de la lista (instancia de un objeto), lo procesa, y regresa un valor booleano.
RemoveAt(índice). Elimina el elemento con el índice llamado.
RemoveRange(índice, cantidad). Elimina la cantidad especificada de elementos a partir del índice indicado.
**Recuerda que los índices inicial en 0!
A mi todo me toca traducirlo a JS (Yo veo todos estos nuevos conceptos para mi y por dentro estoy pensando en push, pop, shift, unshift, etc. etc. ) xD
:thumbsup:
Hacer Debug en vscode, una gran herramienta.
RemoveALL ? Es lo mismo que una arroy function en javascript? al utilizar un filter ? Es llamado expresión lambda el arrow Function en C# ?
Exacto! es llamado expresiones lambda. El ejemplo de código que tienes es correcto y muy claro.
Estas explicaciones debian ser en Windows Form
Queue (Cola): Trabaja bajo el pensamiento FIFO (First In First Out) primero en entrar primero en salir, como funcionaría una cola en un banco o similar, quien llega primero se atiende primero.
me encanto programar con c# lo elegi como mi primer lenguaje de programacion y no me arrepiento gran curso ademas
Buena elección. No te vas a arrepentir en el futuro.
Hasta ahora va siendo un gran lenguaje.
Si bien ya he usado Javascript, Python y Dart, C# no se queda atrás.
Fácil de aprender y poderoso.
Me sorprendió gratamente la eficiencia de la lista.
Hice un experimento de cuanto tardaba en imprimir un array de 20 números contra una lista de 20 números.
.
Primero, para el arreglo en 3 intentos los tiempos fueron 11.21ms, 17.82ms y 16.05ms
.
Stopwatch tiempoArray =new();tiempoArray.Start();var arrayLista =newint[20]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};foreach(var item in arrayLista){Console.WriteLine($"{item}");}tiempoArray.Stop();Console.WriteLine($"Tiempo total {tiempoArray.Elapsed.TotalMilliseconds}");
.
Luego para la lista, los tiempos fueron 5.67ms, 5.86ms y 5.55ms
.
Stopwatch tiempoColeccion =new();tiempoColeccion.Start();var coleccionLista =newList<int>{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};foreach(var item in coleccionLista){Console.WriteLine($"{item}");}tiempoColeccion.Stop();Console.WriteLine($"Tiempo total {tiempoColeccion.Elapsed.TotalMilliseconds}");
La lista fue notablemente más eficiente
Sorprendente, gracias por compartirlo. 👏
Lista vista en el curso
<List<int> numeros =newList<int>();>
Como agregar datos
<numeros.Add(1);>
Eliminar datos en List
<numeros.RemoveAt(0);>
Alguien podria ayudarme por favor?
No entiendo que sucede con las Jornadas
el error sucede porque no es Jornada=TipoJornada.Mañana
es el nombre de la clase enum que usted llamo que supongo que tambien debe se TipoJornada entonces debe escribir
TipoJornada=TipoJornada.Mañana
basicamente a lo que me refiero es que debes mirar como se llama el metodo que es de tipo TipoJornada que es la clase de enumeracion y asi lo debes llamar en donde lo estas llamando Jornada
tal vez un poco tarde pero estando en esta clase lo recordé, por que listaCursos se declara como var y no como, por ejemplo => List listaCursos = new List()
Alguien podria decirme las diferencias de por que usar var en lugar de ponerle el tipo?
Según tengo entendido var se utiliza para declarar una variable como tipo indefinido, osea que no tiene ningún tipo, la diferencia estaría en que si declaras una variable var puedes hacerla objecto de cualquier clase, sin embargo si la declaras como List<T> ya estas diciendo que es de una lista de tipo T, por lo que solo la puedes usar como lista de tipo T al momento de asignarla.
mnemotecnia para pilas y colas:
Queue(Cola): Primero en llegar → primero en irse
Imagínense la cola de un mercado o del banco; el primero que llega es el primero que atienden.
Stack(Pila): Primero en llegar → último en irse
Imagínense una pila de platos; el primero que ponen es que está hasta abajo de todo, por lo tanto, ese será el último en irse.
por que esta seccion en una linea falta () pero si se añade funciona sin problema
En el 00:20 el profe no tiene () en la tercera linea pero si yo lo pongo no pasa nada
Me auto respondo, ya que no vamos a pasar parametros, puede omitirse
escuela instancia a Escuela, y luego escuela.Curso, me confundi..
Si, tu variable escuela instancia un Escuela (clase) y ahora tu escuela tiene las mismas propiedades de una clase Escuela, entonces puedes llamar a .cursos que comparten las características de los cursos de Escuela.
No solo al principio es confuso pero al igual que las matemáticas una vez lo entiendes hasta es entretenido.
holas, porfavor si me pudieran orientar…
escuela.Cursos --> es todo una sola variable? o la variable es escuela y .Cursos es la clase.. me confundo porque se utiliza en Ecuela y tambien en Curso.
gracias
Hola Jose
escuela en este caso en un objeto, que se creo instanciado la clase Escuela, cuando se tiene la instruccion escuela.Curso quiere decir que se esta accediendo a la propiedad Curso del objeto escuela.
holas, porfavor si me pudieran orientar..
escuela.Cursos --> es todo una sola variable? o la variable es escuela y .Cursos es la clase.
gracias, saludos
Hola Jose,
en este caso la varible como tal es escuela que es una instancia de la clase Escuela, esta clase tiene propiedades a las que puedes acceder desde la instancia, como por ejemplo la de tu pregunta es Cursos que en este caso hace referencia a una coleccion de objetos de la clase Curso dentro de la clase Escuela
Osea, una escuela tiene varios cursos.
Alguien puede ayudarme por favor?
¿Ya te aseguraste que el enum de TiposJornada sea del tipo string?
Ahí el error te dice que no puede asignar el valor a Jornada porque Jornada solo acepta valores string
Si quieres asignarle el valor del enum, como string a Jornada, debes convertir a string el enum que le estás asignando.
Hola Fernando, revisa que en el archivo json la ruta este bien, se encuentra en la línea 13 y es la siguiente:
"program": "${workspaceFolder}/sample1/bin/Debug/netcoreapp3.0/sample1.dll",
Si sigues presentando el mismo inconveniente, te recomiendo utilizar Visual Studio Community 2019, tiene una interfaz más amigable, es el que estoy utilizando actualmente para el curso, si te interesa te dejo el link:
https://visualstudio.microsoft.com/es/vs/community/
Saludos.
Estimado JuanK, cómo se maneja en memoria una colección como List<Curso> ?, el objeto List<Curso> va en el heap y su referencia en el stack, ó todo va al stack como es el caso de los arreglos ?