2013-03-01 97 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