【问题标题】:Skip `n` iterations in foreach loop在 foreach 循环中跳过“n”次迭代
【发布时间】:2019-05-23 11:38:17
【问题描述】:

如何在 for each 循环中跳过 n 的迭代次数。

下面是一个例子。在 if 条件下,将涉及超过 1 个节点。这些节点应该从 foreach 循环中省略。例如。在 if 语句中涉及 3 个节点,我需要 foreach 循环跳转到下一次迭代的第 4 个节点。

foreach (XmlNode node in docs.SelectNodes(query))
{
   if (condition = true)
    {

       do
        {

           XmlNode nextnode = parentnode.NextSibling;
           string nextnodetest = nextnode.LocalName;
           if (nextnodetest = "Programme")
           {
            //calculate duration.
            }
       while (nextnodetest !=programme)

      }
    // skip the nodes in the foreach loop that were involved in the if/do statements above
}

如何从 foreach 循环迭代中跳过这些节点。

【问题讨论】:

  • 满足条件时使用continue;
  • 不清楚你在问什么,这是什么意思"在第一个循环检查条件并在下一个节点上做一些工作"也请澄清这个"现在应该从 foreach 循环中省略 if 语句中包含的节点"
  • 是的,包含在 if 语句中的节点应该从 foreach 循环中排除,因此 continue simple 将不起作用。
  • 好的,所以每个人都很困惑,您需要重写您的问题以更简洁,也许是一个更好的例子。如果英语是你的问题,也许你可以找人帮你解决措辞
  • 变了,现在好点了吗。

标签: c# xml foreach


【解决方案1】:

可能是这样的

        XmlNodeList nodeList = docs.SelectNodes(query)
        XmlNode node;
        for (int i = 0; i < nodeList.Count; i++)
        {
            node = nodeList[i];
            if (condition == true)
            {

                int itemsToSkip = 0;
                string nextnodetest;
                do
                {
                   ...

                    if (nextnodetest == "Programme")
                    {
                        itemsToSkip++;
                        //calculate duration.
                    }
                } while (nextnodetest != "Programme");

                i = i + itemsToSkip;
            }

            ... your code 
        }

【讨论】:

  • 您的代码中有一个小问题。它正在执行i=i+itemsToSkip,但是当它进入 foreach 循环时,它再次执行 i++。所以它添加了另一个 1。
  • 那么只需减去 1...i = i + itemsToSkip - 1;
  • 对不起,请忽略。它做得很好。让我更深入地研究它。谢谢。
  • 是的,我下班后明天早上会接受
  • 很好。谢谢
【解决方案2】:

试试这个代码:

var nodes = docs.SelectNodes(query).OfType<XmlNode>().ToArray();
for (int i=0; i< nodes.Length; i++)
{
    if(condition....)
    {
      ....
      i+= n;
    }

}

【讨论】:

  • 它说System.Xml.XmlNodeList 不包含“计数”的定义
  • System.Xml.XmlNodeList 不包含“toArray”的定义
  • @user726720 - 你需要 docs.SelectNodes(query).OfType&lt;XmlNode&gt;().ToArray() 才能工作。
  • @Enigmativity&@Saeed:这似乎满足了我想要实现的目标。我现在将浏览其余的代码,看看它是否工作正常。但就目前而言,它非常好。 @Saeed,请更新答案,我会尽快接受。谢谢
【解决方案3】:

只需使用 for 循环:

var nodes = docs.SelectNodes(query).ToList();
for(int i = 0; i < nodes.Count; i += n)
{
   XmlNode node = nodes[i];
}

【讨论】: