Вот код, который в основном делает то, что вы хотите, и его можно изменить, чтобы получить точный результат. Я не совсем понял требования к порядку, поэтому не смог получить код в соответствии с вашим конкретным примером.
var inputs = new string[] {"12","121c","13","131","1311","ab","121","132","1212","abc"};
var roots = inputs.Where(x=>!inputs.Any(y=>x.StartsWith(y) && y!=x)).OrderBy(x=>x);
var grouped = roots.Select(x=>inputs.Where(y=>y.StartsWith(x)).OrderByDescending (y => y));
var finalList = grouped.SelectMany (x => x);
foreach(var item in finalList)
{
Console.WriteLine(item);
}
Как это работает, прежде всего, получить наши «корни», которые являются конечными родителями. Он делает это, перебирая все элементы. Для каждого элемента (x
) он затем снова проверяет, начинается ли x
с любого из элементов, кроме самого себя. Если они есть, то это не корневой родитель (поскольку этот элемент является его родителем).
В этом случае мы получаем предметы, которые хотим сгруппировать. Затем мы перебираем эти элементы, получая любой из предметов, которые являются дочерними (или детьми детей и т. Д.) И сортируют их. Затем мы имеем IEnumerable<IEnumerable<string>>
. Затем мы используем SelectMany
, чтобы сгладить это в нашем окончательном списке.
В настоящее время указанные выходы:
121c
1212
121
12
132
1311
131
13
abc
ab
который имеет 132, прежде чем 1311. Это потому, что под струнный упорядоченности и нисходящих 132 предшествует 1311. Для того, чтобы получить это в порядке, вы хотите просто необходимо обновить OrderByDescending в строке grouped
, чтобы выполнить заказ, который вы хотите.
Это не очень хорошая одностроковая линия, и она не обязательно эффективна (первая часть для получения Roots - O (n^2)).
Откуда вы знаете группу «1» и «а»? Другими словами: что определяет, какая часть идентификатора является номером родителя? – Richard
Ричард: Если я правильно читаю, потому что «12» существует, а «121» начинается с «12», то «12» является родительским элементом «121». Я предполагаю, что 1 не является родителем «12», потому что «1» не существует. Аналогично, я предполагаю, что «121» является родителем «1212» и «121c». – Chris
Вот что я подумал, но это не соответствует примеру, который ставит «121» с «121c». – Richard