2013-03-01 81 views
0

我解释与嵌套列表的文本文件的格式如下逻辑创建嵌套列表

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

我想这些物品放入<UL> </UL >列表。我正在努力研究这样做的逻辑,目前它是通过空间数量计算“深度”的可怕混乱,并根据最后一个深度是更高还是更低来添加打开或关闭标记。

必须有一个聪明,整洁的逻辑来做到这一点,我错过了?

回答

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; 
} 

如果您拥有的只是您显示的数据,那才是真正实现它的唯一方法。你必须计算空间。

+0

谢谢吉姆,我希望有一种解决方法。首先,它将我限制在有限的层次上(这可能是我应该做的)。我可能会采取完全不同的方式,使用div而不是无序列表,只需添加一个缩进它们一定数量的类 – roryok 2013-03-02 11:27:59

+0

我没有看到具有有限数量级别的问题。在这种情况下,“有限”意味着超过20亿。如果你真的希望变大,你可以使用“长”。而且,是的......你可以用'div'来完成。它会略微简化逻辑,因为你不必担心嵌套。 – 2013-03-02 14:01:02

+0

啊,我误解了代码,虽然它只是迎合了单一的深度级别,并且我不得不添加更多的if语句。谢谢 – roryok 2013-03-02 19:04:22