Moja pierwsza myśl była zamówieniu przez długości łańcucha ... ale potem pomyślałem o takiej liście, która może zawierać coś w rodzaju aliasów dla krótkich nazw:
/longsitename/
/a
/a/b/c/
/a
/a/b/
/otherlongsitename/
... i pomyślałem, lepszym rozwiązaniem było zamówić przez liczbę znaków Separator poziom pierwszy:
IEnumerable<string> SortURLs(IEnumerable<string> urls)
{
return urls.OrderBy(s => s.Count(c => c == '/')).ThenBy(s => s);
}
Wtedy pomyślałem o nim trochę więcej i widziałem ten wiersz w swoim pytaniu:
nie mogę utworzyć/nODE2/sub-node1 bez/node2 istniejący
Aha!Kolejność sekcji lub sekcji nie ma znaczenia, o ile dzieci są zawsze wymienione po rodzicach. Mając to na uwadze, moja oryginalna myśl była w porządku i zamawianie przez długości łańcucha sam powinien być dobrze:
IEnumerable<string> SortURLs(IEnumerable<string> urls)
{
return urls.OrderBy(s => s.Length);
}
Które mnie doprowadzić w końcu do zastanawiać, dlaczego ja dbał o długości w ogóle? Jeśli po prostu posortuję ciągi, niezależnie od długości, ciągi o tym samym początku będą zawsze sortować najpierw krótszy ciąg. Tak więc, w końcu:
IEnumerable<string> SortURLs(IEnumerable<string> urls)
{
return urls.OrderBy(s => s);
}
Zostawię pierwszą próbkę, bo może to być przydatne, jeśli w pewnym momencie w przyszłości, trzeba bardziej leksykalny lub logiczny porządek.
To dalszy rodzaj pomocy można umieścić w dół, co już próbowałem. –
Co zrobić, jeśli najpierw odwrócisz każdy ciąg przed sortowaniem? – cgTag
Co masz na myśli przez 'create node2'? Być może istnieje implementacja, która nie będzie potrzebować nawet poziomów root na liście ... – BrunoLM