C sharp - Como detener un foreach?

   
Vista:

Como detener un foreach?

Publicado por Molitaa (6 intervenciones) el 14/06/2017 23:30:24
Hola estoy tratando de finalizar un foreach cuando se cumple la condición, pero no me lo permite, estoy utilizando break hay alguna otra forma de finalizar el ciclo ?

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Como detener un foreach?

Publicado por Damian (9 intervenciones) el 15/06/2017 11:37:00
Un foreach en teoría no debería terminar repentinamente para eso usa un while(condicion). o un Do while si tiene que entrar en ese código al menos una vez.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Como detener un foreach?

Publicado por Molitaa (6 intervenciones) el 15/06/2017 16:41:39
gracias Damian, bueno esto es para un calendario que estoy coloreando de acuerdo a las jornadas que tiene los trabajadores, hay una jornada que es de 8x2 dejo 8 en blanco y 2 en color naranja hasta la fecha final de su trabajo y he agregado que la jornada más que es de 12x3 doce días de color blanco y 3 de color naranja el detalle es que deseo mostrar las dos jornadas en mi clanedario y que se muestren coloreadas, para esto utilice un foreach para lograr lo que tengo, pero ahora quiero detener la jornada 8x2 y que continué con la jornada 12x3 por eso estaba buscando como tenerlo, he colocado una condición con if que si mi día del evento es igual a la fechafinal de la jornada ahí pinte y finalice pero que continué con la nueva jornada que sería 12x3, lo que logro es mostrar son dos jornadas coloreadas en mi clanedario pero sin tener un fin o bien la jornada 12x3 si se marca y la jornada 8x2 solo me marca de color el día en que finaliza la jornada y no me muestra los días anteriores.
crees que con el if sea suficiente? o debo cambiar a while
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Como detener un foreach?

Publicado por john (4 intervenciones) el 15/06/2017 16:47:34
Hola es incorrecto lo que Damian dice cualquier ciclo puede finalizarse bajo cierta condicion.

si quieres finalizarlo puedes entenderlo con el siguiente ejemplo para este caso si value es igual a 15 se termina.

saludos.

1
2
3
4
5
6
7
8
9
10
11
Console.WriteLine("--- foreach-loop and break ---");
foreach (int value in array) // Use foreach loop
{
    Console.WriteLine(value);
    // ... See if the iteration variable has value of 15.
    if (value == 15)
    {
        Console.WriteLine("Value found");
        break;
    }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Como detener un foreach?

Publicado por Molitaa (6 intervenciones) el 15/06/2017 17:11:06
Hola John, gracias, te comento que estoy finalizando con break, pero como que no me lo toma en cuenta te comparto el código para que puedas ver si estoy equivocada en la forma en que lo estoy haciendo.

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
private void calFecha_DayRender(object source, DayRenderEventArgs e)  //Colores en Calendario
{
    bool final = true;
    if (ddloperadores.SelectedValue != "Todos")
    {
        DataTable asistencia = OperadoresBL.OperadoresForaneosAsistencia((int)WAPS.Globals.ConvertTo(txtNumOperador.Text, 0)).Tables[0];    //Datos de Store 
 
        if (asistencia.Rows.Count > 0)
        {
            foreach (DataRow iRow in asistencia.Rows)
            {
            string Tipo = iRow["TipoJornada"].ToString();
            DateTime FechaJornada = Convert.ToDateTime(iRow["Jornada_Ini"]);
            string Cambio = iRow["cambio"].ToString();
            string Estatus = iRow["Estatus"].ToString();
            DateTime FechaFinJornada = Convert.ToDateTime(iRow["Jornada_Fin"]);
 
            if ((Tipo == "1")) //Tipos de Jornadas
            {
                if (FechaJornada <= e.Day.Date)
                {
                    lblJornada.Text = 8x2;
                    int rem = (e.Day.Date - FechaJornada).Days % 10; //Total de días
                    if (rem >= 0 && rem <= 7) //Días Laborales
                    {
                        e.Cell.BackColor = System.Drawing.Color.White;
                        if (e.Day.Date == FechaFinJornada)
                        {
                            break;
                        }
                    }
                    else
                    {
                        e.Cell.BackColor = System.Drawing.Color.DarkOrange;
                        if (e.Day.Date == FechaFinJornada)
                        {
                            break;
                        }
                        else
                        {
                            return;
                        }
 
                    }
                }
                else
                {
                    e.Cell.BackColor = System.Drawing.Color.White;
                }
            }
            if ((Tipo == "2") )
            {
                lblJornada.Text = "12x3";
                if (FechaJornada <= e.Day.Date)
                {
                    int rem2 = (e.Day.Date - FechaJornada).Days % 15;//Total de días
                    if (rem2 >= 0 && rem2 <= 11) //Días Laborales        
                    {
                        e.Cell.BackColor = System.Drawing.Color.White;
 
                    }
                    else
                    {
                        e.Cell.BackColor = System.Drawing.Color.DarkOrange;
 
                    }
                }
                else
                {
                    e.Cell.BackColor = System.Drawing.Color.White;
                }
            }
    }
}

en la imagen del calendario se puede ver donde se pintan las dos jornadas y la de 8x2 debe finalizar el día 9 por lo cual ya no se debería de marcar pero me la sigue marcando como que no toma en cuenta que se debe finalizar


calendario
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Como detener un foreach?

Publicado por john (1 intervención) el 15/06/2017 17:40:37
Hola uff siempre se me complica ver tantos if's te recomiendo que separes el codigo en diferentes metodos,
asi podras entenderle mejor.

Primero has un debug a tu codigo y en la sentencia if verifica que la comparacion sea la correcta entre las dos fechas,con dias horas min, asi te aseguraras que llamas a break; ahora no estoy seguro
pero parece que despues del break no haces nada mas, asi que puedes cambiarlo por return es decir
llegas al final del metodo.


como te decia debes estructurar mejor tu codigo asi lo entenderas mejor por ejemplo


Tu tienes al inicio:

1
2
3
4
5
6
7
8
9
10
11
12
13
bool final = true;
if (ddloperadores.SelectedValue != "Todos")
{
DataTable asistencia = OperadoresBL.OperadoresForaneosAsistencia((int)WAPS.Globals.ConvertTo(txtNumOperador.Text, 0)).Tables[0]; //Datos de Store 
 
if (asistencia.Rows.Count > 0)
{
foreach (DataRow iRow in asistencia.Rows)
{
string Tipo = iRow["TipoJornada"].ToString();
DateTime FechaJornada = Convert.ToDateTime(iRow["Jornada_Ini"]);
string Cambio = iRow["cambio"].ToString();
string Estatus = iRow["Estatus"].ToString();

para eliminar un corchetes en todo el codigo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bool final = true;
if (ddloperadores.SelectedValue == "Todos")
{
return ;//evitas mas comparaciones y finalizas el metodo
}
 
DataTable asistencia = OperadoresBL.OperadoresForaneosAsistencia((int)WAPS.Globals.ConvertTo(txtNumOperador.Text, 0)).Tables[0]; //Datos de Store 
 
if (asistencia.Rows.Count == 0)
{
return ;//nada que hacer no hay renglones
}
 
foreach (DataRow iRow in asistencia.Rows)
{
string Tipo = iRow["TipoJornada"].ToString();
DateTime FechaJornada = Convert.ToDateTime(iRow["Jornada_Ini"]);
string Cambio = iRow["cambio"].ToString();
string Estatus = iRow["Estatus"].ToString();
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Como detener un foreach?

Publicado por john (4 intervenciones) el 15/06/2017 17:49:52
Olvide comentarte te decia que verificaras la comparacion de la fecha
porque parece ser que una es Date y otra DateTime segun recuerdo no son lo mismo
en caso que no tengas el mismo formato

cambia

if (e.Day.Date == FechaFinJornada)

por

if (e.Day.Date == FechaFinJornada.Date)


me avisas que pasa
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Como detener un foreach?

Publicado por Molitaa (6 intervenciones) el 15/06/2017 19:34:42
modifique el código como me lo muestras, y coloque el Date. a mi FechaFinJornada
lo deje de la siguiente manera en el Tipo de Jornada 1
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
if (Tipo == "1")//Tipos de Jornadas
                        {
                            if (FechaJornada <= e.Day.Date)
                            {
                                lblJornada.Text = FechaFinJornada.ToString();
                                    int rem = (e.Day.Date - FechaJornada).Days % 10; //Total de días                                       
                                        if (rem >= 0 && rem <= 7) //Días Laborales  
                                        {
                                            e.Cell.BackColor = System.Drawing.Color.White;
                                            if (e.Day.Date == FechaFinJornada.Date)
                                            {
                                                return;
                                            }
                                        }
                                        else
                                        {
                                            e.Cell.BackColor = System.Drawing.Color.DarkOrange;
                                            if (e.Day.Date == FechaFinJornada.Date)
                                            {
                                                return;
                                            }
                                        }
                            }
                            else
                            {
                                e.Cell.BackColor = System.Drawing.Color.White;
                            }
                        }

con estos cambios solo me marca el final de la primera Jornada, pero no me marca los demás días en color naranja que se le asigno al usuario y continua con la nueva Jornada de forma correcta.






calendario2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Como detener un foreach?

Publicado por john (4 intervenciones) el 15/06/2017 20:06:02
uuups entonces no son el final de tu metodo la comparacion
sustituye return por el break como lo tenias pensado al principio,
al menos ya sabes que no estabas comparando correctamente
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Como detener un foreach?

Publicado por Molitaa (6 intervenciones) el 15/06/2017 21:42:33
Lo he cambiado de la siguiente manera:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if (rem >= 0 && rem <= 7) //Días Laborales  
                                        {
                                            e.Cell.BackColor = System.Drawing.Color.White;
                                            if (e.Day.Date == FechaFinJornada.Date)
                                            {
                                                break;
                                            }
 
                                        }
                                        else
                                        {
                                            e.Cell.BackColor = System.Drawing.Color.DarkOrange;
                                            if (e.Day.Date == FechaFinJornada.Date)
                                            {
                                                break;
                                            }
                                            else
                                            {
                                                return;
                                            }
                                        }

y así es como me muestra las dos Jornadas mes tras mes osea que la primera no se detiene en el fin de la jornada.
Que me estará fallando
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Como detener un foreach?

Publicado por john (4 intervenciones) el 15/06/2017 22:13:24
Lo unico raro que noto es que pintas antes de comparar si es el fin de la jornada,

1
2
3
4
5
e.Cell.BackColor = System.Drawing.Color.White;
if (e.Day.Date == FechaFinJornada.Date)
{
    break;
}

si no quieres que se pinte quizas es

1
2
3
4
5
6
if (e.Day.Date == FechaFinJornada.Date)
{
    break;
}
 
e.Cell.BackColor = System.Drawing.Color.White;


tendras que hacer un debug paso por paso, pon puntos de interrupcion en los ifs
y verficaras en cual bloque no esta funcionando o tal vez alguna instruccion deshaga
tus cambios de un bloque anterior.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Como detener un foreach?

Publicado por Damian (9 intervenciones) el 08/07/2017 01:31:18
Hola john,
No dije que no se pudiese usar un break, dije que para eso tienes otras herramientas para hacer más efectivo y mantenible tu código si quieres que se salga si la variable es 15 lo deberías poner así mejor:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Console.WriteLine("--- foreach-loop and break ---");
     // ... See if the iteration variable has value of 15.
    While (value != 15)
    {
       if (value == 15)
         {
          Console.WriteLine("Value found");
         }
       else
        {
         Console.WriteLine(value);
        }
        Console.WriteLine("Value found");
    }
 
}

En caso de ser una colección, si quieres que este mientras busca una variable X existe para eso el While o el Do While.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar