【问题标题】:How can I avoid an If/Then Statement From Checking its "IF"如何避免 If/Then 语句检查其“IF”
【发布时间】:2016-01-29 01:30:45
【问题描述】:

我想知道是否有人知道如何避免在以下代码中重新运行 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 > setting_EPP
没有“如果/那么”检查每个循环。

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

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

编辑:循环在后台运行,目前大约需要 4 小时才能完成。我一直在尝试找到某种方法将其置于循环之外,但是我运气不佳。我唯一能想到的就是在运行上述代码的线程旁边运行另一个线程,每隔几分钟运行一次 If 语句?

【问题讨论】:

  • 你不能把逻辑从循环中拿出来吗?
  • if 语句移出循环? if (UrlList.Count &gt; setting_EPP) table_populate(0); for (int i = 0....)
  • 我一直在试图弄清楚如何将它带出循环,但这在后台线程中运行。所以我必须计时吗?或者也许我可以创建一个只触发一次的事件?但我相信这只会导致我使用不同的 if 语句。代码永远运行,直到程序关闭或到达最后一页(大约 11200,每 1.3 秒(大约 4 小时)一页)
  • 如果您有其他问题未包含在您的问题中,edit 您的问题,以便我们可以使用它们,因此我们不会浪费时间来帮助您信息不完整。
  • System.Threading.Thread.Sleep(x++ % 10 ? 0 : 延迟); ?

标签: c# if-statement for-loop


【解决方案1】:

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

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

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

更传统的模式 - 有“条件满足,不再检查”的标志 - 但确实需要if 声明。

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

【讨论】:

  • 谢谢,唯一共享的数据是 UrlList,但它仅在此循环中写入。 (我还应该使用 Lock 吗?) PS:这真的很聪明,我从没想过用无操作替换委托
  • @JasonBrown 如果可以从您需要锁定/同步的任何其他线程读取/更新 UrlList。您可能希望显示更完整的示例,以实际演示乳清“UrlList”更改 - 如果它在循环内增长,则在您调用该方法时更新简单的 isTablePopulated 标志将是最易读的解决方案。
  • 为了语法正确,我必须将check = () =&gt; {}; 更改为check = delegate{}; 不确定,但这两个语句是否相同?
  • @JasonBrown 听起来您使用的是旧版本的 .Net / Visual Studio。
  • @JoelCoehoorn 我正在运行 VS2013 社区版,为 .net 4.5 构建
【解决方案2】:

我首先要注意条件表达式的两边似乎都不受循环体的影响;也就是说,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++;
}

【讨论】:

  • 感谢您的回复,但我无法在循环之前运行 if,因为 Load_page 是填充 UrlList 的内容,它是控制 setting_EPP 的用户设置(它不会实际上将它转换为一个设置,只是准备)虽然我知道只有 1 或 2 个 if 语句不会造成太大的延迟,但是当你只需要它运行第一个循环时,检查每个循环似乎很浪费成功的时间。
  • 如果 load_page() 填充了 UrlList,我将对您的代码进行两次设计更改。首先是让load_page() 返回加载的数据(您的UrlList)。第二个是让load_page() 负责填充表格。
  • 我让它像那样运行,但我试图更多地分解代码,以便函数更“功能化”,(之前它调用了 6 个左右的方法链)
  • 链式函数调用:A().B().C()...函数式编程方式。
  • 唯一的问题是,我有用户输入更改填充到表中的内容,而 load_page() 继续抓取直到程序结束。因此,如果 load_page 填充了表格,我将不得不更改表格的填充方式(当前它将所有数据存储在内存中,然后显示本地计算的“页面”)或列出 1 个表格中的每个条目(这将导致行数估计为 250 万)。从本质上讲,“如果”语句是我避免创建我仍然难以理解的事件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多