【问题标题】:Render a string only on first iteration of a loop仅在循环的第一次迭代时渲染字符串
【发布时间】:2014-11-17 09:25:07
【问题描述】:

有没有办法仅在循环第一次到达那里时附加 ul class="nav nav-third-level background-white collapse" ?我试过了,bool和一个计数器,但显然它每次都会被初始化,我尝试了一个goto来跳过增量,但这样它甚至不会初始化它:)

我正在尝试获取以下 HTML 代码:

<li class="">
    <a href="#"><i class="fa fa-fw"></i>First Level<span class="fa arrow"></span></a>
    <ul class="nav nav-second-level background-white collapse">
        <li>
            <a href="#">Second Level1</a>
            <ul class="nav nav-third-level background-white collapse">
                <li>
                    <a href="#">Third Level1</a>
                </li>
                <li>
                    <a href="#">Third Level2</a>
                </li>
            </ul>
            </li>
        <li>
            <a href="#">Second Level2</a>
            <ul class="nav nav-third-level background-white collapse">
                <li>
                    <a href="#">Third Level4</a>
                </li>
                <li>
                    <a href="#">Third Level5</a>
                </li>
            </ul>
        </li>           
    </ul>
</li>

这是我的 C# 代码:

private static string RenderMenuRecursive(ItemMenu menu, int level)
{
    StringBuilder sb = new StringBuilder();
    if (level > 0)
    {
        int firstIteration = 0; // This will be initialized as 0 every time :\

        if (level == 1)
        {
            sb.AppendLine("<li class=\"\"><a href=\"#\"><i class=\"fa fa-fw\"></i>"+ menu.name + "<span class=\"fa arrow\"></span></a>");
        }
        if (level == 2)
        {
            sb.AppendLine("<ul class=\"nav nav-second-level background-white collapse\"><li><a href=\"#\">" + menu.name + "</a>");
        }
        if (level == 3)
        {
            if (firstIteration == 0)
            {
                sb.AppendLine("<ul class=\"" + "nav nav-third-level background-white collapse" + "\">");
                firstIteration++;
            }

            sb.AppendLine("<li><a href=\"#\">" + menu.name + "</a></li>");
        }

    }

    level++;

    foreach (ItemMenu subMenu in menu.subMenuItems)
    {
        sb.AppendLine(RenderMenuRecursive(subMenu, level));
    }

    return sb.ToString();
}

这是我实际得到的:

<li class=""><a href="#"><i class="fa fa-fw"></i>First Level<span class="fa arrow"></span></a>
<ul class="nav nav-second-level background-white collapse"><li><a href="#">Second Level1</a>
<ul class="nav nav-third-level background-white collapse">
<li><a href="#">Third Level1</a></li>

<ul class="nav nav-third-level background-white collapse">
<li><a href="#">Third Level2</a></li>

<ul class="nav nav-second-level background-white collapse"><li><a href="#">Second Level2</a>
<ul class="nav nav-third-level background-white collapse">
<li><a href="#">Third Level3</a></li>

<ul class="nav nav-third-level background-white collapse">
<li><a href="#">Third Level4</a></li>

【问题讨论】:

  • 那么问题出在缩进上?
  • @MotiAzu,不,我无法获得预期的代码
  • 你为什么不关闭uls & lis?
  • 对不起,我试图理解你的问题并比较了代码 sn-ps,但没有设法得到它。您能否将代码简化为核心部分,并说明您的“实际”版本与您想要的版本到底有什么问题?
  • 哦,知道了。你在第三级得到了太多的“
      ”标签,对吧?

标签: c# html .net asp.net-mvc stringbuilder


【解决方案1】:

您在错误的位置定义和初始化变量。由于您在每次迭代中调用您的方法,因此您的变量会获得一个新的范围,并且在每次迭代中也会被初始化。

如果你想在你的 for-each 循环中调用方法,你需要让方法知道你在哪个迭代中。例如通过引入一个参数:

private static string RenderMenuRecursive(ItemMenu menu, int level, bool firstIteration)
{
    [...]

        if (level == 3)
        {
            if (firstIteration)
            {
                sb.AppendLine("<ul class=\"" + "nav nav-third-level background-white collapse" + "\">");
                firstIteration++;
            }

            sb.AppendLine("<li><a href=\"#\">" + menu.name + "</a>");
        }

    [...]

    var firstIteration = true;

    foreach (ItemMenu subMenu in menu.subMenuItems)
    {
        sb.AppendLine(RenderMenuRecursive(subMenu, level, firstIteration));
        firstIteration = false;
    }

    return sb.ToString();
}

需要说明的是,这个问题根本与渲染、StringBuilders、HTML 或 MVC 无关。这只是一个如何使用嵌套(递归)方法调用和状态的问题......

【讨论】:

    【解决方案2】:

    问题在于 int firstIteration = 0; 它将始终设置为 0,因为它不是静态成员(无论如何您都应该避免使用静态成员)

    您应该将参数添加到您的方法 RenderMenuRecursive(subMenu, level, renderUl) 并移动

    int firstIteration = 0; // 每次都会初始化为0

    int firstIteration = 0;
    
    foreach (ItemMenu subMenu in menu.subMenuItems)
    {
        sb.AppendLine(RenderMenuRecursive(subMenu, level, firstInteration == 0));
    
        firstIteration++; 
    }
    

    还要考虑方法名称更改,因为没有递归调用。

    【讨论】:

      猜你喜欢
      • 2017-11-16
      • 2019-12-19
      • 1970-01-01
      • 2016-06-19
      • 2023-04-07
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多