LINUX.ORG.RU

Простая реализация дерева в C#

 ,


0

1

Имеется код, который заполняет элементы TreeView (используется только экземпляр TreeNodeCollection).

Все не-листовые узлы имеют только строковое имя.

Все строковые узлы имеют имя, а так же данные (объекты одного и того же типа, хранящие только данные), хранящиеся в св-ве Tag.

Этот процесс должен быть разбит на 2 части:

1. Заполнение древовидной структуры данных 2. Заполнение TreeView на основании данных этой структуры

Для пункта 1 требуется реализация простейшей древовидной структуры данных, которая выглядит как TreeNodeCollection (методы Add и коллекция Nodes ).

И, самое главное:

В листовых узлах нужно так же пользовательские данные (Экземпляр одного и того же класса MyOwnClass)

Нужно для загрузки/представления в памяти следующей JSON-структуры:

topLevelItem: {
   subItem: {
      field1: val1,
      field2: val2
   }
},
oneLevelItem: {
    field1: val1,
    field2: val2
}

Зы. В MSDN не посылать. Был там. Везде используют Left и Right.

Зы. зы. В университете был. Сабж учил. Методичске сожжены. С проподом в однклассниках не контачу. На экзамене такое темы не было.

В последний раз дерево пришлось применять 20 лет назад. На лекции в тетрадку записывал.

Ответ на: комментарий от EnterpriseMobility

ты понимаешь, что такое аутсорсинг?

это когда за миску риса набирают макак, неспособных реализовать дерево в C#? )

Harald ★★★★★
()

Сначала искренне хотел помочь. Потом прочитал что нужно. Больше не хочу.

Почему? Ответ прост:

1) С этой задачей справится школьник в каком-то виде. Легко. Ты же за это получаешься деньги, на сколько я понял.

2) Ты поставил огромное количество условий таким образом, что надо поддерживать изначально-архитектурно-неправильное решение. Зачем? Если ты программер, то это, очевидно, надо изначально делать по-другому.

Ты, вот, лучше, скажи, где то, что ты описываешь нужно вообще?

Quickern ★★
()
Ответ на: комментарий от EnterpriseMobility

Но у меня уже теперь нет соответствия 1-к-1 между тем что в JSON и теп, что на экране.

Я написал

на основании данных этой структуры

.

Мне нужно чтобы JSON-овское представление вида

// У меня пока обычный Dictionary
// Я не могу пока парсить вложенные группы
// Нужно огранизовать структуру
// Или ср-вами встроенных классов .NET (каких?)
// Или написать свою легковесную структуру 
-<вложенные друг в друга группы, содержащие только имена>
// Это все уже оформлено в виде объекта
-{
--Hosts: { (Узел Hosts с данными о хосте)
---HostName: {
----IP
----Port
----... 
---}
--} 
--Endpoints : { (список эндпоинтов)
--- Информация о Endpoint-e 1 (объект с полями)
--- ...
----}
-}

должно отображаться в виде

-<вложенные друг в друга группы, содержащие только имена>
--HostName1 имя хоста 1
---Endpoints Все ендпоинты 
--HostName2 имя хоста 2
---Endpoints Все теже эндпоинты

Теперь вопросы:

1) Я правильно сделал, что гружу JSON в свою структуру? 2) На какой странице Кнута мне искать идеи для сабжа? 3) Зачем я должен читать материал, где рассказывается про бинарные деревья? А еще есть красно-черные и серо-буро-малиновые. 4) Мне фирма платит деньги не за то, чтобы я выдумывал еще один велосипед.

EnterpriseMobility
() автор топика

Кстати, спросил у немецких коллег. Знаете, что они ответили:у нас должна быть библиотека классов, спроси у нашего сеньора.

Сеньор: в нашей библиотеке классов нет такого.

EnterpriseMobility
() автор топика

В последний раз дерево пришлось применять 20 лет назад. На лекции в тетрадку записывал.

А чем ты эти 20 лет занимался между университетом и нынешним днём?

Harald ★★★★★
()
Ответ на: комментарий от Harald

Хех, это даже вчерашнему школьнику способно ЧСВ поднять, не то что мастерам)

next_time ★★★★★
()
Ответ на: комментарий от Harald

И да, кстати, а как мне с универской программой, где были только бинарные деревья (Left, Right, ога),а C# ВООБЩЕ тогда не было (он тогда не существовал вообще) решить указанную проблему?

А чем ты эти 20 лет занимался между университетом и нынешним днём?

работал.

EnterpriseMobility
() автор топика
Ответ на: комментарий от EnterpriseMobility

И да, кстати, а как мне с универской программой, где были только бинарные деревья (Left, Right, ога),а C# ВООБЩЕ тогда не было (он тогда не существовал вообще) решить указанную проблему?

Ну как бе университетское образование подразумевает способность к самостоятельному мышлению и самообразованию, а был ли тогда C# это совершенно не важно

работал.

и так за 20 лет и не доработался до сеньора? )

Harald ★★★★★
()

ахахахаха. вот это уровень 20-летнего стажа

anonymous
()
Ответ на: комментарий от EnterpriseMobility

Поддержу остальных в этом треде - ты полезен хотя бы тем, что смог поднять самомнение даже мне.

anonymous
()
topLevelItem: {
   subItem: {
      field1: val1,
      field2: val2
   }
},
oneLevelItem: {
    field1: val1,
    field2: val2
}

Непонятная структура данных в JSON. Что она имеет общего с деревом не понятно. Как связаны topLevelItem и oneLevelItem неясно.

Int0l ★★
()
Ответ на: комментарий от Quickern

это сарказм или что? У меня код от предыдущего программиста. Он именно так сделал. Кажется я знаю почему. Он тоже задолбался ИСКАТЬ реализацию дерева в C#.

EnterpriseMobility
() автор топика
Ответ на: комментарий от peregrine

я уже писал это.

В указанном коде нужно заменить класс TreeNodeCollection, привязанный к Windows Forms/TreeView на собстевнную

private void loadXXX(JProperty prop, TreeNodeCollection nodes) {
    // Любой узел (листовой/не-листовой) ВСЕГДА имееет имя
    TreeNode node = new TreeNode(prop.Name);
    if (Листовой узел) {
        // Заполням данные для листового узла
        ...
        // Эти данные могут быть ТОЛьКО у листового узла
        node.Tag = obj;
        nodes.Add(node);
    } else { // Обрабатываем нелистовой элемент        
        nodes.Add(node);
        // Рекурсивно 
        foreach (JProperty p in prop.Value) {
            loadXXX(p, node.Nodes);
         }
    }
}

существующая своя реализация использует линейнуюй структуру - словарь

EnterpriseMobility
() автор топика

За 20 лет стажа не уметь реализовать дерево? :\

CatsCantFly
()

Да вали из профессии уже.

templarrr ★★★★★
()

Так, а в чем проблема-то? Дерево построить? Вот это должно придумываться и писаться за две минуты, не больше.

class Tree<T>
{
	private readonly List<Node<T>> _roots = new List<Node<T>>();
	
	public IReadOnlyList<Node<T>> Roots => _roots;
	
	public void AddRoot(Node<T> root)
	{
		_roots.Add(root);
	}
}

class Node<T>
{
	private readonly List<Node<T>> _children = new List<Node<T>>();
	private readonly Node<T> _parent;
	
	public Node(T value, Node<T> parent)
	{
		Value = value;
		_parent = parent;
	}
	
	public T Value { get; set; }
	
	public IReadOnlyList<Node<T>> Children => _children;
	
	public Node<T> Parent => _parent;
	
	public bool IsRoot => _parent == null;
	
	public bool IsLeaf => _children.Count == 0;
	
	public void AddChild(Node<T> node)
	{
		_children.Add(node);
	}
}
BlackHawk
()
Ответ на: комментарий от anonymous

Ну вот, а говорили что шарп занял нишу дельфи.

vazgen05 ★★★
()
Ответ на: комментарий от EnterpriseMobility

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

BlackHawk
()
Ответ на: комментарий от BlackHawk

твое дерево - строго типизированное.

Оно хранит в каждом узле одно и то же значение T.

Мне нужно T только на листьях.

На всех узлах - строки.

EnterpriseMobility
() автор топика
Ответ на: комментарий от EnterpriseMobility

Ну так добавь еще одно свойство к нодам, и на узлах заполняй только строки, а на листьях только Т. В чем проблема то?

Int0l ★★
()
Ответ на: комментарий от EnterpriseMobility

Не, тебе дерево не описать надо, а нарисовать, чтобы разобраться, оно тебе какое нужно вообще. А затем немного подумать. В твою задачу я даже вникать не хочу, т.к. ты сам не хочешь.

peregrine ★★★★★
()
Ответ на: комментарий от Int0l

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

Frost ★★★
()

Как-то так:

public class MyTree<T1, T2> {
  List<MyTree<T1, T2>> childs;
  string name;
  T1 val1;
  T2 val2;

  public void Draw(TreeView treeView) {
    treeView.BeginUpdate();
    treeView.Nodes.Clear();
    DrawNode(treeView.Nodes);
    treeView.EndUpdate();
  }

  void DrawNode(TreeNodeCollection parentNodes) {
    TreeNode thisNode = new TreeNode(this.name);
    parentNodes.Add(thisNode);
    
    TreeNode thisNodeValues = new TreeNode("Свойства");
    thisNodeValues.Nodes.Add(new TreeNode(val1.ToString());
    thisNodeValues.Nodes.Add(new TreeNode(val2.ToString());
    thisNode.Nodes.Add(thisNodeValues);

    foreach (var child in childs) {
      child.DrawNode(thisNode.Nodes);
    }
}
anonymous
()
Ответ на: комментарий от anonymous

что такое TreeNodeCollection ? Блин - на гитхабе проще найти решение, чем у людей спрашивать.

Люди — г..но

EnterpriseMobility
() автор топика
Ответ на: комментарий от anonymous

учись студент

Зы. В результате решения задачи было установлено:

1) LinqPad с дебаггером рулит 2) Stackoverflow - говно. Русские форумы - тоже. 3) Книги - тоже говно. Бумагомаратели. Ни одного нормального рецепта. 4) ГитХаб - рулит. Там сидят программисты. Да.

EnterpriseMobility
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.