如何暂停for循环,然后在同一位置重启?

时间:2015-11-03 17:06:38

标签: c# for-loop

我有一个for loop,它在一个按钮点击处理程序中为一组标签(连接组件标记算法)编号和颜色,如何在执行任何步骤后使循环暂停,并在循环中的相同位置重放再次点击按钮后? 下面是我的代码:

private void Button1_Click(object sender, EventArgs e)
{
    int counter = 1;
    for (int i = 1; i < 161; i++)
    {
        try
        {
            if (i == 1 && labelss[i].Text == "")
            {
                labelss[i].Text = "1";
            }

            if (labelss[i].Text == "0")
            {
                //do nothing
            }
            else //if the label is not 0
            {                       
                if (labelss[i - 1].Text !="0")
                {
                    labelss[i].Text = labelss[i-1].Text;
                }
                else //if (labelss[i-1].Text=="0")
                {                            
                     if (i > 20)
                    {
                        if (labelss[i - 20].Text != "0")
                        {
                            labelss[i].Text = labelss[i - 20].Text;
                        }
                        else
                        {
                            counter++;
                            labelss[i].Text = counter.ToString();
                        }
                    }
                    else if(i < 20)
                    {
                        counter++;
                        labelss[i].Text = counter.ToString();                               
                    }
                }
            }
        }
        catch
        {
        }
    }
}

3 个答案:

答案 0 :(得分:3)

您需要做的是将算法抽象到一个独立于按钮单击的单独类中。然后,这可以保持状态(例如,它改变了颜色的标签数量)。您需要传递类似First column: ------------- A/T = 2/5 T/T = 1/5 A/A = 2/5 Second column: ------------- C/C = 1/5 C/G = 4/5 Third column: ------------- G/G = 1/5 C/C = 1/5 C/G = 3/5 的内容,可以在每次迭代时调用,并返回Func<int, bool>true,具体取决于您是否要停止。

false

答案 1 :(得分:1)

你需要两件事

  • for循环作为一个单独的函数,采用&#34;当前索引&#34;作为参数。
  • 一种存储&#34;当前索引的方法&#34;点击之间。
    在这个例子中,我使用Session。

    // Process one label only.
    public void ProcessLabel(int i)
    {
        // ... body of for loop ...
    }
    
    // Store current index between clicks.
    private int CurrentIndex
    {
        get { return (int)Session["MyCurrentIndex"]; }
        set { Session["MyCurrentIndex"] = value; }
    }
    
    // Processes one label, per click.
    private void Button1_Click(object sender, EventArgs e)
    {
        int i = CurrentIndex;
    
        if (i >= 161)
            return;     // End of for loop
    
        ProcessLabel(i);
    
        // On next click, CurrentIndex+1 will be processed.
        CurrentIndex = i + 1;
    }
    
    // Call this function during page initialisation.
    private void OnInit()
    {
        // Setup the first click.
        CurrentIndex = 1;
    }
    

答案 2 :(得分:-1)

我相信使用Yield关键字会做的事情:) ..

https://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx