C#Foreach迭代读取到列表末尾

时间:2018-04-21 07:23:48

标签: c# selenium foreach

我目前正在使用带有文本文件的foreach循环遍历列表,但是当它到达列表的末尾时它会自行返回,所以从第1行到第10行然后它从10变为1而不是结束?

代码示例 -

public static int lineint = 1;

Foreach功能:

        foreach (String line in File.ReadLines(@"input.txt").Skip(lineint))
        {
            string[] data = line.Split(':');
            string query = data[0];
            string uri = data[1];



            if (driver.FindElements(By.Name("search")).Count != 0)
            {
                // exists
                driver.FindElement(By.Name("search")).SendKeys(search);
                driver.FindElement(By.Name("uri")).SendKeys(uri + Keys.Enter);

                CheckResponse(line); //triggers function

            }
            else
            {
                driver.Manage().Cookies.DeleteAllCookies();
                driver.Navigate().Refresh();
            }
        }

CheckResponse(线);功能 -

    private static void CheckResponse(string line)
    {

        if (driver.FindElements(By.XPath("//*[@id='modal']/div/div/div/p[contains(text(), 'Search not found')]")).Count != 0)
        {


            Console.WriteLine(line + " - Failed Search");

            lineint = lineint + 1;

            foreachsearchfunc(); //function for the foreach loop

        }
        else
        {
            Console.Writeline("Success");
        }

    }

所以会发生的情况是每个函数在文件的第一行发送请求然后触发checkresponse函数,如果检查响应返回“Search not found”,它会在.skip上用+ 1重新触发foreach,跳过第一行到第二行,第四行。

但是当它到达列表的末尾时会发生什么,只要它自己运行,例如 -

输入=

Search1:Uri1
Search2:uri2
Search3:Uri3

进程=

Search1:Uri1
Search2:uri2
Search3:Uri3
Search3:Uri3
Search2:uri2
Search1:Uri1
Search1:Uri1
Search2:uri2
...

并继续循环列表和第四个..

1 个答案:

答案 0 :(得分:0)

为了简单起见,我将命名您的功能"每个"和"检查"。

似乎发生了这种情况:

  1. 您输入"每个"并分支到调用"检查"。
  2. 的if语句
  3. 检查增加开始位置,并调用"每个"试。
  4. "每个"现在执行其行为,并返回"检查"。
  5. "检查"返回"每个"来自#1并继续执行它。
  6. 如果不确切知道它应该如何运作,您可以通过在break;

    之后的新行添加CheckResponse(line);来阻止这种情况发生

    如果退出循环取决于"检查"成功与否,你应该改变它以返回布尔值:

    private static boolean CheckResponse(string line)
    

    然后在"成功"中添加return true; " if"的一部分和{34}中的return false;失败" if的一部分。然后你可以有条不紊地打破"每个"方法:

    if (CheckResponse(line))) // or `if (!CheckResponse(line))`, depending on what you need
    {
        break;
    }
    

    事实上,您是否可以简化您对此所做的事情?:

    foreach (String line in File.ReadLines(@"input.txt").Skip(lineint))
    {
        string[] data = line.Split(':');
        string query = data[0];
        string uri = data[1];
    
    
    
        if (driver.FindElements(By.Name("search")).Count != 0)
        {
            // exists
            driver.FindElement(By.Name("search")).SendKeys(search);
            driver.FindElement(By.Name("uri")).SendKeys(uri + Keys.Enter);
    
            if (driver.FindElements(By.XPath("//*[@id='modal']/div/div/div/p[contains(text(), 'Search not found')]")).Count == 0)
            {
                 Console.WriteLine("Success");
                 break; // exit the loop
            }
        }
        else
        {
            driver.Manage().Cookies.DeleteAllCookies();
            driver.Navigate().Refresh();
        }
    }