Pertanyaan Lakukan tindakan hanya jika suatu kondisi terpenuhi di semua iterasi loop


Apakah ada cara untuk hanya memicu tindakan ketika suatu kondisi dipenuhi semua iterasi a for lingkaran?

Contoh:

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

Ini yang saya coba, tetapi tidak berhasil seperti yang diharapkan:

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

31
2017-08-12 13:05


asal


Jawaban:


Ada solusi klasik:

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

Pada awalnya kami berasumsi, bahwa semua kondisi (loop) terpenuhi: var flag = true. Jika setidaknya satu ketentuan tidak dipenuhi: if (i % b != 0), kami menghentikan proses perulangan: break; karena tidak perlu melanjutkan pemeriksaan, dan mengatur flag = false, sekarang melalui flag variabel kami mengetahui hasil pemeriksaan kami dan dapat menggunakannya nanti untuk menentukan apakah kami harus menghubungi SomeAction() atau tidak.


86
2017-08-12 13:09



Anda juga bisa menggunakan query LINQ sederhana seperti ini:

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

93
2017-08-12 13:23



Bagaimana hanya:

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

Jika Anda ingin memeriksa bahwa nomor Anda habis dibagi dengan banyak angka, itu sama dengan memeriksa apakah nomor Anda habis dibagi dengan kelipatan paling umum dari semua angka tersebut. Dalam hal ini, itu 24* 32* 5 * 7 * 11 * 13 * 17 * 19.


37
2017-08-12 20:14



Jadi Anda ingin membuat rantai sejumlah ekspresi boolean yang sangat mirip tanpa menulis semuanya secara eksplisit.

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

Hal pertama yang dapat Anda lakukan adalah mengekstrak kombinasi ekspresi yang digunakan dalam if pernyataan menjadi fungsi baru. Ini membuat kode Anda lebih mudah dibaca.

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() kemudian dapat diimplementasikan dengan for loop seperti yang Anda coba.

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

    return true;
}

By the way: namespace LINQ menyediakan banyak metode pembantu yang memungkinkan Anda menulis kode seperti itu jauh lebih singkat dan lebih bersih:

using System.Linq;

// ...

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

25
2017-08-12 13:25



Mudah:

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



Anda bisa menulisnya seperti ini

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

Itu membuat bool menjadi salah ketika satu kondisi salah, sehingga hanya dijalankan do action x; ketika semua kondisi benar.

Anda juga bisa melakukannya dalam garis yang lebih sedikit dengan Linq:

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

Penjelasan: Enumerable.Range mengembalikan Array dengan nilai 1 hingga 20 dan .Semua memeriksa ekspresi Lambda untuk setiap objek.


3
2017-08-12 13:17



Ada beberapa jawaban serupa di sini yang menggunakan bendera. Solusi yang lebih sederhana adalah menggunakan variabel loop (b dalam pertanyaan Anda) sebagai syarat untuk diuji:

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;
           } 
}

Sesudah ini:

if (action)
{
// do your action 
}

Semoga membantu. :)


3
2017-08-12 13:09