在Do循环中重用前一个字符串

时间:2018-02-19 09:56:05

标签: c# loops do-while

我们的想法是重用上一次循环迭代中使用的字符串。

public void StringMain()
{
    string temp;
    int times = 0;

    do
    {
        string input;
        string reuse;

        if (times == 0)
        {
            input = Request();
            times++;
            temp = input;
        }

        else if (times > 0)
        {
            reuse = Reuse();

            if (reuse == "Y" || reuse == "y")
            {
                input = temp;
                // error here: unassigned local variable temp
            }
            else
            {
                input = Request();
                temp = input;
            }
        }
        // Do stuff with string

} while (Console.ReadLine() != "Q" || Console.ReadLine() != "q")

我认为通过将string temp变量等同于初始input并将新temp存储在do循环之外,我可以将input设置为{如果用户请求,则在下一次迭代中{1}}变量不重置temp变量。 (推理>默认字符串初始化为空)。从而有效地复制粘贴前一个字符串。

但是,我收到错误:在temp的注明行中未分配的局部变量。我理解为什么,temp目前没有任何价值,但是在第一次迭代后会得到一个值。

我可以这样做,还是以完全错误的方式解决这个问题?

如果我有如何复制上一次循环迭代中使用的字符串?

tempRequest()方法只返回字符串并要求用户输入。如果使用它们,它们在下面:

Reuse()

注意:如果可能的话,我不想使用任何预定义的方法。

我查看了以下问题,但它们都与数组有关,并且都在java中。他们甚至都没有接近我想做的事情,所以我无法使用相同的概念。

Button to show previous string

add string to string array and display last/previous string in that string array

提前致谢!

1 个答案:

答案 0 :(得分:0)

错误的直接原因是未分配的temp字符串。但是,更深层原因是太复杂代码,保持简单

// bool: Reuse is supposed to return true/false (i.e. yes/no) 
// static: You don't want any "this" in the context
private static bool Reuse() {
  Console.WriteLine("Reuse previous string?");
  Console.WriteLine("Y - N?");

  return Console
    .ReadLine()
    .Trim()     // Be nice and trim out spaces (esp. trailing ones)
    .Equals("y", StringComparison.OrdinalIgnoreCase);
}

public void StringMain() {
  //bool: we don't want count, say 15-th input, but a fact is it a first try
  bool firstTime = true; 
  string temp = null;    // Make compiler be happy, assign the local variable

  do {
    // We can reuse if and only if
    //  1. It's not the first Time run
    //  2. We allow it, i.e. Reuse() returns true
    input = !firstTime && Reuse() 
      ? temp
      : Request();

    firstTime = false;
    temp = input;

    // Do stuff with string 
  }
  while (!Console.ReadLine().Trim().Equals("q", StringComparison.OrdinalIgnoreCase));
}