Primero crearemos una clase (en mi caso la llame Negocio_Vacaciones, puesto que es una app de nomina)
public class Negocio_Vacaciones
{
public int DiasDisfrute(DateTime Fecha_Inicio, DateTime Fecha_Fin)
{
int DiasNormales;
int DiasHabiles;
int Contador;
DateTime Aux_Fecha;
int DiaSemana;
string Aux_FechaInicio;
string Aux_FechaFin;
DiasNormales = 0;
DiaSemana = 0;
DiasHabiles = 0;
Contador = 0;
DiasNormales = Convert.ToInt32((Fecha_Fin - Fecha_Inicio).TotalDays);
Aux_FechaInicio = Fecha_Inicio.ToString("dd-MM-yyyy");
Aux_FechaFin = Fecha_Fin.ToString("dd-MM-yyyy");
if (Aux_FechaInicio != Aux_FechaFin)
{
if (DiasNormales == 2)
{
DiasHabiles = 1;
}
else
{
while (Contador < DiasNormales)
{
Aux_Fecha = Fecha_Inicio.AddDays(Contador);
DiaSemana = GetDayWeek(Aux_Fecha);
if ((DiaSemana != 5) && (DiaSemana != 6))
{
DiasHabiles = DiasHabiles + 1;
}
Contador = Contador + 1;
}
}
}
else
{
DiasHabiles = 0;
}
return DiasHabiles;
}
private int GetDayWeek(DateTime Fecha)
{
int Dia=0;
switch (Fecha.Date.DayOfWeek.ToString())
{
case "Monday":
Dia = 0;
break;
case "Tuesday":
Dia = 1;
break;
case "Wednesday":
Dia = 2;
break;
case "Thursday":
Dia = 3;
break;
case "Friday":
Dia = 4;
break;
case "Saturday":
Dia = 5;
break;
case "Sunday":
Dia = 6;
break;
}
return Dia;
}
}
Comentarios sobre la versión: 1.0.1.32 (2)
- Da rodeos completamente innecesarios convirtiendo datos entre diferentes formatos para luego hacer un if: El método GetDayWeek() convierte de System.DayOfWeek a string y luego a int. Esto no tiene ningun sentido.
- Compara fechas usando su representacion en string en lugar de comparar los datos en si mismos. Esto es muy propenso a errores y debe evitarse siempre que sea posible.
- Es innecesariamente rebuscado (lleno de ifs y whiles) en lugar de usar las ventajas del lenguaje C#.
- No cumple con las convenciones de nombres establecidas en C#, que indican que tanto las variables locales como los parámetros de los métodos se deben nombrar usando camelCase.
La forma correcta e idiomática de escribir este código, usando la última versión de C# es esta:
{
{
};
{
var currentDate = fechaInicio;
{
}
}
}
Aqui un ejemplo del mismo que se puede probar online: http://csharppad.com/gist/52676f7407ec685f1a6cb80e79a781c1
Explicación:
- Se declara el array diasHabiles con los dias de la semana que consideramos hábiles.
- El bloque iterador RangoDeFechas() devuelve la colección de todas las fechas entre fechaInicio y fechaFin.
- se devuelve el Count() de elementos de dicha colección cuyo dia de la semana esté incluido en el array.
Así de simple y sencillo, en 3 simples pasos. Aprendamos a usar C# correctamente.