c#打破while和foreach

时间:2018-02-19 18:22:26

标签: c# foreach while-loop

解决问题我有点困难。我正在寻找一个名为' _1VfKB'的课程的所有元素。在这个元素的内部,带有一个'数据图标'作为一个属性。我正在使用while循环,所以如果数据图标收到值X它继续运行,否则它结束循环(while)。但是,当我的情况被触发时,我该如何打破这段时间?

private void CheckIfMsgSent() {
  while (true) {
   IReadOnlyCollection < IWebElement > els = driver.FindElementsByClassName("_1VfKB");
   foreach(IWebElement el in els) {
     IWebElement span = el.FindElement(By.TagName("span"));

     if (span.GetAttribute("data-icon") == "status-time") {
      Thread.Sleep(1000);
      break;
     }
     /* If no element is found with the data-icon = "status-time", break while and break foreach*/

                }
            }
        }

2 个答案:

答案 0 :(得分:0)

在某些语言(如PHP)中,你可以break 2打破两个循环......但是在C#中,为了清晰的代码,你最好还是让你的代码更具可读性。例如。添加&#34; continueLooking&#34;变量

关于你如何突破两次的逻辑是令人困惑的,因为你把评论INSIDE循环。这对我有用的唯一方法就是让它在循环之外...否则你每次都会在第一次迭代中存在循环...所以最好理解我可以集合的代码,我认为它应该是这样的:

private void CheckIfMsgSent() {
  var continueLooking = true;
  bool foundElement;

  while (continueLooking) {
   foundElement    = false;
   IReadOnlyCollection < IWebElement > els = driver.FindElementsByClassName("_1VfKB");
   foreach(IWebElement el in els) {
     IWebElement span = el.FindElement(By.TagName("span"));

     if (span.GetAttribute("data-icon") == "status-time") {
      Thread.Sleep(1000);
      foundElement = true;
      break;
     }
   }
   if( !foundElement ) {
     continueLooking = false;
   } 
 }

答案 1 :(得分:0)

在开始之前分配一个变量,然后在其中,你有你的意见,改变那个变量的状态。

开始于:

bool loopState = true;
while(loopState)
{
    bool found = false;
    if (span.GetAttribute("data-icon") == "status-time") {
        found = true;          
        Thread.Sleep(1000);
        break;
    }

然后你有这个评论:

/* If no element is found with the data-icon = "status-time", break while and break foreach*/

添加:

if(!found)
    loopState = false;

这会在成功时打破内循环,但保持外循环运行。但是如果你点击了所有元素并且不匹配,那么你的While循环的下一次迭代将不会执行,因此你的Foreach也不会执行。