【问题标题】:Logic for creating nested lists创建嵌套列表的逻辑
【发布时间】:2013-03-01 22:34:41
【问题描述】:

我正在解释具有以下格式的嵌套列表的文本文件

- todo
  - clean kitchen
    - do dishes
    - sweep floor
  - cook dinner
    - defrost fish
  - shopping
    - milk
    - eggs

我想将这些项目放入

    列表中。我正在尝试弄清楚这样做的逻辑,目前通过空格数计算“深度”并添加打开或关闭ul标签取决于最后一个深度是否更高或降低。

    必须有一个我缺少的聪明、简洁的逻辑来做这件事吗?

    【问题讨论】:

      标签: c# html logic nested-lists


      【解决方案1】:

      使用string.IndexOf 应该很容易确定级别:

      string line = file.ReadLine();
      int level = line.IndexOf('-');
      level = (level - 1)/2;
      

      处理关卡的逻辑更有趣一些。像下面这样的东西应该可以正常工作。

      int lastLevel = -1;
      string line;
      while ((line = file.ReadLine()) != null)
      {
          int level = GetLevel(line); // from code above
          int diff = level - lastLevel;
          if (diff > 1)
          {
              // skipping multiple levels forward is probably an error.
              throw new ApplicationException();
          }
          if (diff == 1)
          {
              // next level. Add a <ul>
              WriteUl();
          }
          else if (diff == 0)
          {
              // same level. Add an <li>
              WriteLi(line);
          }
          else
          {
              // need to add </ul>, possibly multiple times
              do
              {
                  WriteUlEnd();
                  --lastLevel;
              } while (lastLevel > level);
          }
          lastLevel = level;
      }
      

      如果您所拥有的只是所显示的数据,那确实是唯一的方法。您必须计算空格。

      【讨论】:

      • 谢谢吉姆,不过我希望有办法解决这个问题。一方面,它将我限制在有限数量的级别(也许我应该是)。我实际上可能会采用完全不同的方式,使用 div 而不是无序列表,然后添加一个将它们缩进一定数量的类
      • 我看不出关卡数量有限的问题。在这种情况下,“有限”意味着超过 20 亿。如果你真的想变大,你可以使用long。而且,是的......你可以用div来做到这一点。它会稍微简化逻辑,因为您不必担心嵌套。
      • 啊,我稍微误读了代码,虽然它只满足单一深度级别,我必须添加更多 if 语句。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-08
      相关资源
      最近更新 更多