如何避免If / Then语句检查其" IF"

时间:2015-10-29 02:58:25

标签: c# if-statement for-loop

我想知道是否有人知道如何避免在以下代码中重新运行If语句

int x = 1;
load_page(standurl, 0);
firstentryOnload = UrlList[0];
for (int i = 1; i <= lastPage; i++)
{
    if (UrlList.Count > setting_EPP) table_populate(0);
    System.Threading.Thread.Sleep(delay);
    load_page(standurl, i);
    if (x > 10)
    {
        //refresh firstpage,check for new data
        System.Threading.Thread.Sleep(delay);
        x = 1;
    }
    x++;
}

我想运行table_populate(0);当UrlList.Count&gt; setting_EPP
没有&#34; If / Then&#34;检查每个循环。

基本上我希望它运行If Statement一次然后停止存在。

我知道如何停止运行if / then语句,但我不希望它在运行后继续检查

编辑:循环在后台运行,目前大约需要4个小时才能完成。我一直试图找到一些方法把它放在循环之外,但是我没有太多运气。我唯一能想到的是运行上面代码的另一个线程,每隔几分钟运行一次If语句?

2 个答案:

答案 0 :(得分:4)

您可以在委托中包装条件并在满足条件时替换委托:

 Action check;
 check = ()=> { 
     if (UrlList.Count > setting_EPP) 
     {
        table_populate(0);
        check = () => {}; // replace check with no-op.
     }
   };
 ....
 for(...)
 {
    check();
    ...
 }

此代码由经过培训的专业人士在封闭课程中编写,不要在家尝试(或任何非自学代码)。 :)

更传统的模式 - 有标志说'条件满足,不再检查&#34; - 但确实需要if声明。

注意:如果此代码检查共享日期,则需要使用lock或其他同步方法(即并发集合之一)。

答案 1 :(得分:3)

首先,我要注意条件表达式的两边似乎不受循环体的影响;也就是说,UrlList.Countsetting_EPP似乎都不会在循环体内发生变化。有可能load_page()table_populate()函数改变了某些东西,或者另一个线程改变了某些东西,但是现在我认为这是真的,因为这个问题似乎没有多大意义(我保证:条件检查是您表现的重要或可衡量因素。)

鉴于此,问题仍然不明确,但我将其归结为两种可能性。一个是你只需要在循环开始时加载表。这很简单;只需在进入循环体之前调用它:

int x = 1;
load_page(standurl, 0);
firstentryOnload = UrlList[0];
if (UrlList.Count > setting_EPP) table_populate(0);
for (int i = 1; i <= lastPage; i++)
{

    System.Threading.Thread.Sleep(delay);
    load_page(standurl, i);
    if (x > 10)
    {
        //refresh firstpage,check for new data
        System.Threading.Thread.Sleep(delay);
        x = 1;
    }
    x++;
}

另一种可能性是,如果条件满足,您希望在每次迭代时运行此操作,但只是想避免反复检查条件。在这种情况下,您可以将整个事件包装在一个if()块中:

int x = 1;
load_page(standurl, 0);
firstentryOnload = UrlList[0];
if (UrlList.Count > setting_EPP) 
{
    for (int i = 1; i <= lastPage; i++)
    {
        table_populate(0);
        System.Threading.Thread.Sleep(delay);
        load_page(standurl, i);
        if (x > 10)
        {
            //refresh firstpage,check for new data
            System.Threading.Thread.Sleep(delay);
            x = 1;
        }
        x++;
    }
}
else
{
    for (int i = 1; i <= lastPage; i++)
    {
        System.Threading.Thread.Sleep(delay);
        load_page(standurl, i);
        if (x > 10)
        {
            //refresh firstpage,check for new data
            System.Threading.Thread.Sleep(delay);
            x = 1;
        }
        x++;
    }
}

当然,您可以将大部分重复的代码抽象为单独的方法。

实际上,还有第三种可能性。我可能是错的,并且在循环期间更改了UrlListsetting_EPP,并且您只想在条件成为第一次时运行它,而无需对每次迭代进行检查。在这种情况下,你可以这样做:

int i = 1;
while (i <= lastPage && UrlList.Count <= setting_EPP)
{
    System.Threading.Thread.Sleep(delay);
    load_page(standurl, i);
    if (i % 10 == 0) System.Threading.Thread.Sleep(delay);
    i++;
}
if (i <= lastPage && UrlList.Count > setting_EPP) table_populate(0);
while (i <= lastPage)
{
    System.Threading.Thread.Sleep(delay);
    load_page(standurl, i);
    if (i % 10 == 0) System.Threading.Thread.Sleep(delay);
    i++;
}