Помогите пожалуйста с алгоритмом. У меня есть список такой структуры:
public class Stratigraphy
{
public Stratigraphy(int idType, int idSysstratigraphy, int stratparent, string name, string nameAdd, int ordernum)
{
IdType = idType;
IdSysstratigraphy = idSysstratigraphy;
Stratparent = stratparent;
Ordernum = ordernum;
}
public int IdType { get; set; }
public int IdSysstratigraphy { get; set; }
public int Stratparent { get; set; }
public int Ordernum { get; set; }
}
выглядит, например, так:
Здесь IdType поле для основной сортировки. StratParent родительский элемент ссылается на IdSysstratigraphy. OrderNum порядок следования элементов я общим StratParent
Визуально мне нужно представить эту структуру таким образом:
Как продумать алгоритм, для изображения такой структуры на основании заданного списка?
Если не прибегать к рисованию, то можете воспользоваться стандартным контролом TreeView.
Позволяет строить различные структуры данных на основе нодов TreeNode.
Каждый TreeNode имеет свойство Level и название.
Вот пример заполнения дерева. Предметная область абсолютно другая, но отсюда можете взять шаблон заполнения.
Алгоритм заполнения основан на поуровневом добавлении TreeNode в TreeView.
В вашем случае нужно делать выборку в порядке приоритета ID: Сначала выборка по родительскому ID -> Заполняете ноды 0 уровня -> Выборка по ID, дочернему к родительскому -> Заполняете ноды 1 уровня -> И так далее рекурсивно, пока не достигните последнего уровня.
public static void RefillTreeDK(DKMSContext context, TreeView tree)
{
tree.Nodes.Clear();
tree.BeginUpdate();
TreeNode node0level=null;
TreeNode node1level = null;
TreeNode node2level = null;
List<dkFactory> level0Group = context.dkFactory.AsNoTracking().ToList();
List<dkPlant> level1Group = null;
List<dkName> level2Group = null;
foreach(dkFactory fact in level0Group)
{
node0level = tree.Nodes.Add(fact.id.ToString(),fact.factoryName);
node0level.ImageIndex = 0;
node0level.Tag = fact.id;
node0level.SelectedImageIndex = 0;
level1Group = context.dkPlant.Where(x => x.idFactory == fact.id).OrderBy(x => x.plantName).ToList();
foreach (dkPlant pl in level1Group)
{
//1 уровень
node1level = node0level.Nodes.Add(pl.id.ToString(), pl.plantName);
node1level.Tag = pl.id;
node1level.ImageIndex = 1;
node1level.SelectedImageIndex = 1;
//2 уровень
level2Group = context.dkName.Where(x => x.idPlant == pl.id).ToList();
foreach (dkName dk in level2Group)
{
node2level = node1level.Nodes.Add(dk.id.ToString(), dk.dkTag + ": " + dk.dkDescriptor);
node2level.Tag = dk.id;
node2level.ImageIndex = 3;
node2level.SelectedImageIndex = 3;
}
}
}
tree.EndUpdate();
}
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники