我有一个站点URL列表,
/node1/node1/sub-node1/node2/node2/sub-node1这个列表是以随机顺序给我的,我需要订购它,所以顶级是第一个,然后是子级别等等(因为我不能创建/node2/sub-node1没有/node2现有的).有干净的方法吗?
现在我只是做一个递归调用,说我不能创建sub-node1因为node2存在,创建node2.我希望列表的顺序决定创建并摆脱我的递归调用.
我的第一个想法是按字符串的长度排序......但后来我想到了这样的列表,可能包括类似短名称的别名:
/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)
我将保留第一个样本,因为如果在将来的某个时候,您需要更多的词法或逻辑排序顺序,这可能会有用.
| 归档时间: |
|
| 查看次数: |
478 次 |
| 最近记录: |