Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/47: Рейтинг темы: голосов - 47, средняя оценка - 4.64
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504

Преобразовать Node в строку и наоборот

05.03.2013, 20:46. Показов 9677. Ответов 119
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
имеется класс
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CustomTree
{
    public class Node
    {
        public Node()
        {
            _children = new NodeCollection(this);
        }
        public Node(string name)
        {
            _children = new NodeCollection(this);
            this.Name = name;
        }
        public Node AddNode(string name)
        {
            var rv = new Node(name);
            this.Children.Add(rv);
            return rv;
        }
        Node _parent;
        public Node Parent
        {
            get
            {
                return _parent;
            }
            set
            {
                if (Parent != null || value == null)
                {
                    Parent.Children.Remove(this);
                }
                else
                {
                    value.Children.Add(this);
                }
                _parent = value;
            }
        }
        public string Name { get; set; }
        NodeCollection _children;
        public override string ToString()
        {
            var rv = new StringBuilder(Name);
            foreach (Node ch in Children)
            {
                SubNodeToString(ch, rv);
            }
            return rv.ToString();
        }
        public int Level
        {
            get
            {
                return Parent != null ? this.Parent.Level + 1 : 0;
            }
        }
        void SubNodeToString(Node n, StringBuilder sb)
        {
            sb.Append("\n" + repeat("\t", n.Level));
            sb.Append(n.Name);
            sb.Append(string.Format(" (Parent: {0})", n.Parent.Name));
            foreach (Node ch in n.Children)
            {
                SubNodeToString(ch, sb);
            }
        }
        string repeat(string s, int count)
        {
            var rv = new StringBuilder();
            for (int i = 0; i < count; i++) { rv.Append(s); };
            return rv.ToString();
        }
        public NodeCollection Children
        {
            get
            {
                return _children;
            }
        }
        public class NodeCollection : System.Collections.ObjectModel.Collection<Node>
        {
            internal NodeCollection(Node owner)
            {
                _owner = owner;
            }
            Node _owner;
            protected override void InsertItem(int index, Node item)
            {
                if (!this.Contains(item))
                {
                    base.InsertItem(index, item);
                    item._parent = _owner;
                }
            }
            protected override void RemoveItem(int index)
            {
                this[index]._parent = null;
                base.RemoveItem(index);
            }
        }
    }
}
класс формирует древовидную структуру,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var root = new Node("root");
            var c1 = root.AddNode("child1");
            var c2 = root.AddNode("child2");
            var c1_1 = c1.AddNode("child1_1");
            var c1_2 = c1.AddNode("child1_2");
            var c2_1 = new Node("child2_1");
            c2_1.Parent = c2;
            var c2_2 = c2.AddNode("child2_2");
            Console.Write(root.ToString());
            Console.WriteLine("\n");
            Console.WriteLine("Удаляем узлы\n");
            c2.Children.Remove(c2_2);
            c2_1.Parent = null;
            Console.WriteLine(root.ToString());
            Console.ReadKey();
задача состоит в следующем, нужно сформированное дерево преобразовать в object или строку, передать клиенту(с этим я справлюсь), затем у клиента из object или строки опять получить древовидную структуру
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.03.2013, 20:46
Ответы с готовыми решениями:

Не удается неявно преобразовать тип "UnsafeStack.Node" в "UnsafeStack.Node*" - как исправить?
Узел: namespace UnsafeStack { public unsafe struct Node { public int value; public Node* next; ...

Преобразовать заглавные буквы в строчные и наоборот с использованием таблицы символов
Всем привет! Не подскажете как, допустим в слове &quot;ПриВеТ&quot;, преобразовать заглавные буквы в строчные и наоборот используя таблицу символов?...

Быстрые алгоритмы сборки байтового массива в строку и наоборот
Всем привет! Народ не поделитесь быстрым алгоритмом сборки байтового массива из строки (только цифры) и разборки массива в строку? К...

119
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
10.03.2013, 16:17
Студворк — интернет-сервис помощи студентам
kelod, не уверен, что проблема этим решится. Но конечно можете попробовать
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
10.03.2013, 17:54  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
kelod, не уверен, что проблема этим решится. Но конечно можете попробовать
в xml всё работает, правда с простыми классами, щас буду пробывать с вложениями

Добавлено через 30 минут
когда просто создаю пустое дерево, нормально и сериализируется и наоборот, а вот как только добавляю детей, получаю на сервере следущую ошибку
2013-03-10 17:28:03,898 [18] ERROR Photon.SocketServer.PeerBase - System.InvalidOperationException: Ошибка при создании документа XML. ---> System.InvalidOperationException: При сериализации объекта типа CustomTree.Node обнаружена циклическая ссылка.

Добавлено через 21 минуту
вероятно нужно как то настроить атрибуты в классе Node, помогите пожалуста
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
10.03.2013, 18:07
kelod, думаю проблема именно в MONO, все же они с .Net немного отличаются (например, в mono отсутствует WPF)
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
10.03.2013, 18:20  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
kelod, думаю проблема именно в MONO, все же они с .Net немного отличаются (например, в mono отсутствует WPF)
да наверно, поэтому я уже смирился с xml, но тут тоже проблема, правда на сервере, а там MONO и рядом не стояло, что то не нравиться в классе
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
10.03.2013, 19:18
kelod, я бы попробовал любыми средставми перейти на FW4.0: исправленные баги, новые классы, буст производительности
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
10.03.2013, 19:29  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
kelod, я бы попробовал любыми средставми перейти на FW4.0: исправленные баги, новые классы, буст производительности
как ?? unity работает по своим алгоритмам
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
10.03.2013, 20:14
kelod, а у вас нету своего кода?) К тому же: разве в юнити 4.0.1 нету поддержки FW4.0? На планете уже 4.5 шагает )
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
10.03.2013, 21:32  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
kelod, а у вас нету своего кода?) К тому же: разве в юнити 4.0.1 нету поддержки FW4.0? На планете уже 4.5 шагает )
я не знаю чего там в 4 есть) разумеется там что то поменялось, но они у майкрософта учатся кажется переменяли название кучи ассетов и функций, проще новый проект сделать, чем старый переделывать с 3,5 на 4,0

Добавлено через 3 минуты
может быть сериализатор какой нибудь сторонний использовать?
а то на данный момент получается следующая картина:
-бинарная сериализация не возможна, потому что фраймворк и MONO не очень дружут
-XML работает, но ругается на циклические ссылки, а как это обойти я не знаю((
-SOAP устаревшая говорят


Добавлено через 1 минуту
люди же как то в игрушках вложенные списки передают, что то очень не вериться что у них там деревьев нет
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
10.03.2013, 21:37
kelod, думаю, такие люди архитектуру заранее продумывают и уже во время написания кода знают, что где будет храниться и как будет передаваться. Также кучу тестов имеют, и в случае таких ошибок сразу знают, где подправить, чтобы заработало. Но таких людей не так уж много
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
10.03.2013, 21:46  [ТС]
что же делать?
гонять десятки циклов по дереву это не выход
0
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
10.03.2013, 21:49
Цитата Сообщение от kelod Посмотреть сообщение
-бинарная сериализация не возможна, потому что фраймворк и MONO не очень дружут
MoMA проверит можно ли перенести на моно. (может даже юнити найдешь )
Что с переводом в строку?
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
10.03.2013, 21:58  [ТС]
так стоп, раз мы не можем заставить юнити работать с фраймворком, может можно mono в VS подключить?

Добавлено через 2 минуты
Цитата Сообщение от Noob.net Посмотреть сообщение
MoMA проверит можно ли перенести на моно. (может даже юнити найдешь )
Что с переводом в строку?
да ничего(( я же написал xml не получается сериализировать, а бинарник десериализировать в моно
0
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
10.03.2013, 22:41
kelod, Можно использовать готовый класс TreeNode
Смотрели в его сторону? может с ним проблем будет меньше.

Цитата Сообщение от kelod Посмотреть сообщение
может можно mono в VS подключить?
Вы неправильно понимаете технологию моно. Ответ - нет.

Добавлено через 3 минуты
kelod, Решение в лоб,так как деревья не пилил никогда.
Вот простенький класс и перевод в строку. Минус - не придумал как уровень указать.
Node
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleTree
{
    [Serializable]
    public class Node<T>
    {
        public List<Node<T>> Collection;
        public T Value { get; set; }
        public int Level { get; private set; } 
 
        #region ctors        
        public Node()
        {
            Collection = new List<Node<T>>();
        }
        public Node(T value) :this()
        {
            Value = value;
        }
        public Node(T value,int level)
            : this(value)
        {
            Level = level;
        }
        #endregion
 
 
        public override bool Equals(object obj)
        {
            if (obj == null || !(obj is T))
                return false;
 
            return (obj as Node<T>).Value.Equals(this.Value); 
        }
        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();
 
            var s = this;
            sb.Append(new string('-',this.Level) +Value.ToString()+Environment.NewLine);
 
            foreach (var c in this.Collection)
            {
                sb.Append(new string('-', c.Level) + c.ToString());
            }
            return sb.ToString();
        }
    }
}

ToString()
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
using System;
using System.IO;
using System.Runtime;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization.Formatters.Binary;
 
namespace ConsoleTree
{
    class Program
    {
        static void Main(string[] args)
        {
            Node<int> nodes = new Node<int>();
            nodes.Value = 0;
            nodes.Collection.Add(new Node<int>(1, 0));
            nodes.Collection.Add(new Node<int>(1, 0));
            nodes.Collection.Add(new Node<int>(1, 0));
            nodes.Collection[0].Collection.Add(new Node<int>(12, 1));
            nodes.Collection[0].Collection.Add(new Node<int>(12, 1));
            nodes.Collection[0].Collection[0].Collection.Add(new Node<int>(122, 2));
            nodes.Collection[0].Collection[0].Collection.Add(new Node<int>(123, 2));
 
 
 
            //using (var stream = File.Create("nodes.txt"))
            //    new BinaryFormatter().Serialize(stream, nodes);
 
            //Node<int> nodes1;
            //using (var stream1 = File.OpenRead("nodes.txt"))
            //{
            //    nodes1 = (Node<int>)new BinaryFormatter().Deserialize(stream1);
            //}
 
 
            Console.WriteLine(nodes.ToString());
 
            Console.ReadLine();
        }
    }
 
    
}
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
10.03.2013, 23:08
Noob.net, простенький пример дерева на F# (на C# можно просто переписать):
Haskell
1
2
3
4
5
6
7
8
9
10
11
type BinaryTree =
   | Node of int * BinaryTree * BinaryTree
   | Empty
let rec printInOrder tree =
   match tree with
   | Node (data, left, right)
      -> printInOrder left
         printfn "Node %d" data
         printInOrder right
   | Empty
      -> ()
Думаю и без знания шарпа понятно, что тут происходит printInOrder == обход дерева.
А описание дерева - тупо первые 3 строчки. Звездочкой обозначаются tuple.
1
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
10.03.2013, 23:09
Цитата Сообщение от Psilon Посмотреть сообщение
Haskell
1
2
3
-> printInOrder left
printfn "Node %d" data
printInOrder right
Левый-правый-родитель - всегда хорошо в деревьях,удобно и быстро,но что делать когда у ветки может быть не правая и левая а 10 веток?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
10.03.2013, 23:12
Noob.net, ну это пример бинарного дерева, а так просто вводится указатель на брата.

Добавлено через 2 минуты
Просто если не через указатели, а через коллекции, то будет сложнее работать с деревом рекурсивно, так как нужно будет отличать элемент-коллекция сыновей.
0
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
10.03.2013, 23:16
Цитата Сообщение от Psilon Посмотреть сообщение
если не через указатели, а через коллекции,
ну вот это и вызвало проблему. В принципе 4 байта на уровень много проблем перфоменсу не принесут,но хотелось бы найти минимальный адекватный набор для такого дерева. (хоть и в ансейфе)
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
10.03.2013, 23:18
Noob.net, не думаю, что будут миллионы игроков, а даже 100 тысяч игроков это 400 тысяч лишних байт или 390кб, чем можно спокойно пренебречь, если учесть, что пустая форма занимает 3мб озу.

И да, я указателями и ссылками называю одно и то же, так как отличия между ними для разработчика (а не для GC) практически нету.
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
10.03.2013, 23:22  [ТС]
Цитата Сообщение от Noob.net Посмотреть сообщение
kelod, Можно использовать готовый класс TreeNode
Смотрели в его сторону? может с ним проблем будет меньше.


Вы неправильно понимаете технологию моно. Ответ - нет.

Добавлено через 3 минуты
kelod, Решение в лоб,так как деревья не пилил никогда.
Вот простенький класс и перевод в строку. Минус - не придумал как уровень указать.
Node
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleTree
{
    [Serializable]
    public class Node<T>
    {
        public List<Node<T>> Collection;
        public T Value { get; set; }
        public int Level { get; private set; } 
 
        #region ctors        
        public Node()
        {
            Collection = new List<Node<T>>();
        }
        public Node(T value) :this()
        {
            Value = value;
        }
        public Node(T value,int level)
            : this(value)
        {
            Level = level;
        }
        #endregion
 
 
        public override bool Equals(object obj)
        {
            if (obj == null || !(obj is T))
                return false;
 
            return (obj as Node<T>).Value.Equals(this.Value); 
        }
        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();
 
            var s = this;
            sb.Append(new string('-',this.Level) +Value.ToString()+Environment.NewLine);
 
            foreach (var c in this.Collection)
            {
                sb.Append(new string('-', c.Level) + c.ToString());
            }
            return sb.ToString();
        }
    }
}

ToString()
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
using System;
using System.IO;
using System.Runtime;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization.Formatters.Binary;
 
namespace ConsoleTree
{
    class Program
    {
        static void Main(string[] args)
        {
            Node<int> nodes = new Node<int>();
            nodes.Value = 0;
            nodes.Collection.Add(new Node<int>(1, 0));
            nodes.Collection.Add(new Node<int>(1, 0));
            nodes.Collection.Add(new Node<int>(1, 0));
            nodes.Collection[0].Collection.Add(new Node<int>(12, 1));
            nodes.Collection[0].Collection.Add(new Node<int>(12, 1));
            nodes.Collection[0].Collection[0].Collection.Add(new Node<int>(122, 2));
            nodes.Collection[0].Collection[0].Collection.Add(new Node<int>(123, 2));
 
 
 
            //using (var stream = File.Create("nodes.txt"))
            //    new BinaryFormatter().Serialize(stream, nodes);
 
            //Node<int> nodes1;
            //using (var stream1 = File.OpenRead("nodes.txt"))
            //{
            //    nodes1 = (Node<int>)new BinaryFormatter().Deserialize(stream1);
            //}
 
 
            Console.WriteLine(nodes.ToString());
 
            Console.ReadLine();
        }
    }
 
    
}
я тут гуал мучал там вроде пишут что можно в проекте моно использовать вместо нет , правда у меня появляется вопрос как осуществить связь проектов в решении , если создать два проекта один тот что есть другой с моно, хотя я конечно может чего не так понимаю . Что касаетс9 встроенного класса я про него уже писал тут мне сказали что он только для отображения деревьев но не для хранения. В строку и мой класс отлично превращаеться но что с ним делать потом , как превратить опять в класс?
0
Кодогенератор
 Аватар для hepper
200 / 200 / 51
Регистрация: 15.06.2011
Сообщений: 794
10.03.2013, 23:25
мне кажется сложность в том, что не ясно, что ТС хочет в древовидной структуре передавать, чтото мне подсказывает, что можно сделать проще списком листов/массивов, или списком обычных структур или объектов (не цикличными в общем)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.03.2013, 23:25

Преобразовать строку
Дано целое число N (&gt; 0) и строка S. Преобразовать строку S в строку длины N следующим образом: если длина строки S больше N, то отбросить...

Преобразовать строку
добрый день, знаю, тема заезженная, но походу у меня руки из ж*пы ((( есть такая строка я ее парсю с хтмл страницы и вывожу в листбокс,...

Преобразовать строку в массив
Привет всем, у меня есть вот такой код: WebClient client = new WebClient(); client.Headers =...

Преобразовать строку в int
Есть файл: 13 23 41 12 32 0 2 4

Преобразовать строку в дату
Помогите пожалуйста не могу сделать, как преобразовать время в строку,работаю c Excel, надо вытащить с ячейки время указанное в ней и ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru