Código de C sharp - Calculo de Días Con Excepción Sab-Dom C#

1.0.1.32
estrellaestrellaestrellaestrellaestrella(2)

Actualizado el 23 de Julio del 2017 (Publicado el 21 de Mayo del 2017)gráfica de visualizaciones de la versión: 1.0.1.32
17.207 visualizaciones desde el 21 de Mayo del 2017
estrellaestrellaestrellaestrellaestrella
estrellaestrellaestrellaestrella
estrellaestrellaestrella
estrellaestrella
estrella

12
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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)

21 de Mayo del 2017
estrellaestrellaestrellaestrellaestrella
Por supuesto que este codigo esta pésimamente mal escrito:

- 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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public int DiasDisfrute(DateTime fechaInicio, DateTime fechaFin)
{
    var diasHabiles = new[]
    {
        DayOfWeek.Monday,
        DayOfWeek.Tuesday,
        DayOfWeek.Wednesday,
        DayOfWeek.Thursday,
        DayOfWeek.Friday,
    };
 
    IEnumerable<DateTime> RangoDeFechas()
    {
        var currentDate = fechaInicio;
        while (currentDate < fechaFin)
        {
            yield return currentDate;
            currentDate = currentDate.AddDays(1);
        }
    }
 
    return RangoDeFechas().Count(x => diasHabiles.Contains(x.DayOfWeek));
}

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.
Responder
Imágen de perfil
22 de Mayo del 2017
estrellaestrellaestrellaestrellaestrella
Gracias.! muy bueno, pero cada quien desarrolla a su manera.! las criticas deben ser constructivas no destructivas, muy bueno tu código mas sencillo, a diferencia del mio que dure horas pensando, pero como mucho dije LO HICE.
Responder

Comentar la versión: 1.0.1.32

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad

http://lwp-l.com/s4000