Sep 16 2008
Corte de Control - Algoritmo y Ejemplo en C# {
Un Corte de Control es un algoritmo muy usado a la hora de listar datos. Actualmente es más factible obtener los datos con una consulta SQL, pero el Corte de Control aún es una técnica válida.
Un Corte de Control se compone de 3 partes básicas: principio, cuerpo y fin, en pseudo código sería así:
while(i < cantidadElementos)
{
principio; // inicializar variables y condiciones, obtener datos, etc.
cuerpo; // recorrer los datos respetando la condición.
fin; // mostrar los datos.
}En nuestro ejemplo tendremos datos de alumnos y cursos, la estructura es como si fuese una base de datos, entonces nuestras tablas tendrían la siguiente estructura:
| Alumnos | Cursos | ||
| ID | int | ID | int |
| IDCurso | int | Descripción | string |
| Nombre | string | ||
Y nosotros necesitamos hacer un Corte de Control por ID de Cursos (criterio del corte) para listar los alumnos agrupados por curso, entonces el algoritmo se vería de la siguiente manera:
static void corteDeControl() { // -- principio del corte int i= 0; // variable utilizada para iterar en la lista de cursos int IDCursoAnterior = 0; // variable con la condición del corte Dictionary<int, List<alumno>> resultado = new Dictionary<int, List<alumno>>(); // resultado del corte Console.WriteLine("\n\nListado de alumnos por curso\n"); // imprimir encabezado // -- cuerpo del corte while (i < DS.Cursos.Count) { IDCursoAnterior = DS.Cursos[i].ID; // condición del corte while (i < DS.Cursos.Count && DS.Cursos[i].ID == IDCursoAnterior) // mientras se cumpla la condición del corte { foreach (alumno a in DS.Alumnos) // buscar los alumnos que pertenezcan a ese curso { if (a.IDCurso == IDCursoAnterior) { if (resultado.ContainsKey(IDCursoAnterior)) { resultado[IDCursoAnterior].Add(a); } else { List<alumno> lista = new List<alumno>(); lista.Add(a); resultado.Add(IDCursoAnterior, lista); } } } i++; // siguiente iteración } } //fin del corte imprimir(resultado); // mostrar el listado }
Resumiendo, en pseudo código, el cuerpo del corte de control se vería más o menos así:
while(i < cantidadElementos)
{
IDAnterior = items[i]; // condición del corte
while(i < cantidadElementos && IDActual = IDAnterior)
{
// proceso datos
}
i++;
}Puedes descargar una solución de Visual Studio 2005 con el ejemplo (25.93 KB).
}