Pregunta Haga una acción solo si se cumple una condición en todas las iteraciones de un ciclo


¿Hay alguna manera de activar solo una acción cuando se cumple una condición en todas iteraciones de un for ¿lazo?

Ejemplo:

if ((i % 1 == 0) && (i % 2 == 0) && (...) && (i % 20 == 0))
{
    Do action x
}

Esto es lo que probé, pero no funcionó como se esperaba:

for (int b=1; b<21; b++)
{
    if (i % b == 0)
    {
        // Do something
    }
}

31
2017-08-12 13:05


origen


Respuestas:


Hay una solución clásica

var flag = true;
for(int b = 2; b < 21; b++)
{
     if (i % b != 0)
     {
         flag = false;
         break;
     }
}
if(flag)
   SomeAction():

Al principio suponemos que todas las condiciones (bucles) se cumplen: var flag = true. Si al menos una condición no se cumple: if (i % b != 0), dejamos el proceso de bucle: break; porque no hay necesidad de continuar comprobando, y establecer flag = falseahora vía flag variable conocemos el resultado de nuestra verificación y podemos usarlo más tarde para determinar si debemos llamar SomeAction() o no.


86
2017-08-12 13:09



También podría usar una consulta LINQ simple como esta:

if (Enumerable.Range(1, 20).All(b => i % b == 0))
    DoAction();

93
2017-08-12 13:23



¿Qué tal solo?

if (i % 232792560 == 0) {
    // do action
}

Si desea verificar que su número sea divisible por muchos números, eso equivale a verificar si su número es divisible por el mínimo común múltiplo de todos esos números. En este caso, eso es 24* 32* 5 * 7 * 11 * 13 * 17 * 19.


37
2017-08-12 20:14



Entonces, quiere encadenar una serie de expresiones booleanas muy similares sin escribirlas todas explícitamente.

if ((i % 1 == 0) && (i % 2 == 0) && (...) && (i % 20 == 0))
{
    do action x
}

Lo primero que podría hacer es extraer la expresión combinada utilizada en if declaración en una nueva función. Esto hace que tu código sea más legible.

public static void Main()
{
    // ...

    if (DivisibleByAllUpTo20(i))
    {
        //do action x
    }

    // ...
}

private static bool DivisibleByAllUpTo20(int i)
{
    return (i % 1 == 0) && (i % 2 == 0) && (...) && (i % 20 == 0);
}

DivisibleByAllUpTo20() puede ser implementado con un for como lo intentaste

private static bool DivisibleByAllUpTo20(int i)
{
    for (int b = 1; b < 21; b++)
    {
        if (i % b != 0)
            return false;
    }

    return true;
}

Por cierto: el espacio de nombres LINQ proporciona muchos métodos auxiliares que le permiten escribir dicho código de forma mucho más concisa y limpia:

using System.Linq;

// ...

if (Enumerable.Range(1, 20).All(n => n % i == 0))
{
    // do action x
}

25
2017-08-12 13:25



Fácil:

bool isDividable = true;
for(int b=1; b<21; b++)
{
     if (i % b != 0)
     {
         isDividable = false;
         break;
     }
}

if(isDividable) do something

11
2017-08-12 13:09



bool flag = true;
for(int b=1; b < 21 && (flag &= (i % b == 0)) ; b++)
    ;
if(flag)
   do_action();//do your task

5
2017-08-12 13:45



Podrías escribirlo así

bool doAction = true;
for(int b=1;b<21;b++)
{
  if (!(i % b == 0))
    {
      doAction = false;
    } 
}
if (doAction)
{
  do action x;
}

Eso establece el bool en falso cuando una condición es falsa, por lo que solo se ejecuta do action x; cuando todas las condiciones son verdaderas

También podrías hacerlo en menos líneas con Linq:

var divisors = Enumerable.Range(1, 20);
if(divisors.All(div => i % div == 0))
{
  //do someting
}

Explicación: Enumerable.Range devuelve una matriz con valores de 1 a 20 y .All verifica la expresión Lambda para cada objeto.


3
2017-08-12 13:17



Aquí hay bastantes respuestas similares que usan una bandera. Una solución más simple es usar la variable de bucle (b en su pregunta) como la condición para probar:

int b;
int max = 20;

for (b = 1; b <= max && i % b == 0; ++b) ;

if (b > max) {
    // do something
}

3
2017-08-14 07:38



bool action = true;
for(int b=1;b<21;b++)
{
     if (i % b != 0)
           {
               action = false;
               break;
           } 
}

Después de este:

if (action)
{
// do your action 
}

Espero que haya sido de ayuda :)


3
2017-08-12 13:09