如何在C#中订购此站点URL列表?

chu*_*nce 8 c# linq

我有一个站点URL列表,

  • /node1
  • /node1/sub-node1
  • /node2
  • /node2/sub-node1

这个列表是以随机顺序给我的,我需要订购它,所以顶级是第一个,然后是子级别等等(因为我不能创建/node2/sub-node1没有/node2现有的).有干净的方法吗?

现在我只是做一个递归调用,说我不能创建sub-node1因为node2存在,创建node2.我希望列表的顺序决定创建并摆脱我的递归调用.

Joe*_*orn 5

我的第一个想法是按字符串的长度排序......但后来我想到了这样的列表,可能包括类似短名称的别名:

/longsitename/  
/a  
/a/b/c/  
/a  
/a/b/  
/otherlongsitename/  

...我认为更好的选择是先按级别分隔符的数量排序:

IEnumerable<string> SortURLs(IEnumerable<string> urls)
{
    return urls.OrderBy(s => s.Count(c => c == '/')).ThenBy(s => s);
}
Run Code Online (Sandbox Code Playgroud)

然后我又考虑了一下,我在你的问题中看到了这一行:

如果没有/ node2存在,我无法创建/ node2/sub-node1

啊哈!只要孩子总是在父母之后列出,那么部分或部分内的顺序并不重要.考虑到这一点,我原来的想法是好的,单独按字符串长度排序应该没问题:

IEnumerable<string> SortURLs(IEnumerable<string> urls)
{
    return urls.OrderBy(s => s.Length);
}
Run Code Online (Sandbox Code Playgroud)

这让我终于想知道为什么我关心它的长度呢?如果我只是对字符串进行排序,无论长度如何,具有相同开头的字符串将始终先对较短的字符串进行排序.因此,最后:

IEnumerable<string> SortURLs(IEnumerable<string> urls)
{
    return urls.OrderBy(s => s);
}
Run Code Online (Sandbox Code Playgroud)

我将保留第一个样本,因为如果在将来的某个时候,您需要更多的词法或逻辑排序顺序,这可能会有用.