在事件中分解基于循环的解决方案

时间:2014-03-26 17:01:42

标签: c# winforms loops

我使用嵌套循环生成了一组参考号,并在点击按钮后将它们显示在组合框中,但现在我希望每个按钮点击时在文本框中按顺序显示这些数字中的每一个。我的最终动机是在每次点击按钮时生成一个唯一的ID。

    char ch, sh;
    int i;
    private void button1_Click(object sender, EventArgs e)
    {
        for (sh = 'A'; sh <= 'Z'; sh++)
        {
            for (ch = 'a'; ch <= 'z'; ch++)
            {
                for (i = 1; i <= 9; i++)
                {
                    comboBox1.Items.Add(i + ch.ToString()+sh.ToString());
                }

            }
        }
    }

1 个答案:

答案 0 :(得分:2)

首先,我们可以创建一个迭代器块,根据您当前的定义生成一系列值:

//TODO: rename method to something meaningful
public static IEnumerable<string> GenerateStrings()
{
    for (char sh = 'A'; sh <= 'Z'; sh++)
        for (char ch = 'a'; ch <= 'z'; ch++)
            for (int i = 1; i <= 9; i++)
                yield return string.Concat(i, ch, sh);
}

然后我们可以创建这个序列的实例作为实例字段,并在每次单击按钮时获取下一个项目:

private IEnumerator<string> stringSequence = GenerateStrings().GetEnumerator();
private void button1_Click(object sender, EventArgs e)
{
    if (stringSequence.MoveNext())
        textbox.Text = stringSequence.Current;
}

在旁注中,通常人们在完成它们时会想要处理IEnumerator<T>个对象。虽然你当然可以在表单的Dispose方法中处理这个对象,但在这种特殊情况下,枚举器没有任何东西可以清理,所以没有必要,只要小心,因为许多枚举器做< / em>需要处理。