2015-07-15 4 views
0

Как группировать элементы списка по их родительскому номеру. Связь между родителями и детьми заключается в том, что число детей начинается с номера родителя. Тогда я хочу, чтобы упорядочить по убыванию, если длина детали больш чем 2, то по возрастанию, если длина равна 2.Комплекс Условная группа сортировки по позиции, содержащей другие

Вот пример:

group by

var ordered=balances.GroupBy(item=>item.Num.StartsWith(???)) 

не мог бы попробовать больше возможностей, потому что Я не знаю, с чего начать.

+0

Откуда вы знаете группу «1» и «а»? Другими словами: что определяет, какая часть идентификатора является номером родителя? – Richard

+0

Ричард: Если я правильно читаю, потому что «12» существует, а «121» начинается с «12», то «12» является родительским элементом «121». Я предполагаю, что 1 не является родителем «12», потому что «1» не существует. Аналогично, я предполагаю, что «121» является родителем «1212» и «121c». – Chris

+0

Вот что я подумал, но это не соответствует примеру, который ставит «121» с «121c». – Richard

ответ

0

Вот код, который в основном делает то, что вы хотите, и его можно изменить, чтобы получить точный результат. Я не совсем понял требования к порядку, поэтому не смог получить код в соответствии с вашим конкретным примером.

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)).

Смежные вопросы