Перерыл гугл, примеры есть но большинство из них приспособлены к бд. А у меня вот такая задачка: Пишу я экспертную систему продукционной модели (это не о чём не говорит и это не главное), в файле хранятся не которые данные (вопросы), вытягиваю их и заношу в список объектов: Класс: Code: class A { private string question; private bool goal; private A obj; private int yes; private int no; public A(string buf, bool n, int yes, int no) { question = buf; goal = n; this.yes = yes; this.no = no; } public A(string buf, bool n) { question = buf; goal = n; } public A(A obj) { this.obj = obj; } public bool response() { int n; Console.WriteLine(question); n = Int32.Parse(Console.ReadLine()); if (n == 0) return false; return true; } public bool GetGoal() { return goal; } public string GetQuestion() { return question; } public int GetYes() { return yes; } public int GetNo() { return no; } } Заполняю список (это я для примера, а в реале данные будут тянутся с файла), данные которые хранятся в объектах - вопрос и номера индексов на следующие по ветке вопросы (не обязательно 2): Code: List<A> ob = new List<A>(); ob.Add(new A("Программа для интернета?", false, 1, 2)); ob.Add(new A("Сокеты?", false, 3, 4)); ob.Add(new A("Отладка ядра?", false, 5, 6)); ob.Add(new A("Сетевые протоколы?", false, 7, 8)); ob.Add(new A("Флеш анимация?", false, 9, 10)); ob.Add(new A("Assembler", true)); ob.Add(new A("Мультимеди?", false, 7, 12)); ob.Add(new A("C#/C++", true)); ob.Add(new A("C", true)); ob.Add(new A("JQuery/JavaScript", true)); ob.Add(new A("Php/Html/Css", true)); ob.Add(new A(ob[7])); ob.Add(new A("Linux", false, 13, 14)); ob.Add(new A("Phyton", true)); ob.Add(new A("Ответ не найден", true)); Дерево не бинарное, мне просто нужно показать визуально структуру дерева вопросов и ответов на них. В интернете пишут что нужно рекурсией, пробовал но что то не вяжется. Во общем как мне из List теперь построить дерево, или предложите альтернативу, помогите
Если просто показать структуру то просто добавляй узлы так чтобы они эту структуру отражали. Подробнее опиши объекты которые ты хранишь в листе. Как я поняла есть вопрос и подвопрос и ответы, так? или что?
В объекте хранятся вопрос и две цифры (они же являются индексами объектов на ответы). Например Code: ob.Add(new A("Программа для интернета?", false, 1, 2)); индекс этого объекта 0, а цифры передаваемые 1 и 2 это индексы следующих добавляемых объектов-ответов: Code: ob.Add(new A("Сокеты?", false, 3, 4)); ob.Add(new A("Отладка ядра?", false, 5, 6));
return, советую посмотреть в сторону LinkedList, другие решения мне кажутся как-то костыльно смотрятся.
mrazota да-да вот оно самое должно появится, с этих двух ответов будет ещё по два в каждом (но может быть и больше двух, дерево не обязательно бинарное). W!z@rD а в чём разница что я буду использовать? (не ну я то понимаю разницу LinkedList и List). Если мне нужно всего лишь заполнить treeview со списка, а над списком не будут проводится какие либо операции.
1 цикл по всем элементам листа, пока есть еще элементы 2 проверяем этот элемент корень или ветвь 3 если корень то добавляем и удаляем, если ветвь то проходим по собранному TreeView и добавляемся и удаляем, если не нашли корень ветви, то фиг с ним идем дальше. 4 берем следующий элемент ... по логике должно отработать
в голове понятно, а с реализацией нет. что значит добавляем или удаляем? это? Code: TreeNode root = new TreeNode(ob[0].GetQuestion(); //корень только один в данной проге это первый элемент списка treeView1.Nodes.Add(root);// добавил корень //................................ for(int i=0; i<ob.Count; i++) //цикл по всем переборам списка { int yes = ob[i].GetYes(); //ветвь корня, индекс объекта int no = ob[i].GetNo(); //ветвь корня, индекс объекта TreeNode tn = new TreeNode(ob[yes].GetQuestion()); root.Nodes.Add(tn); tn = new TreeNode(ob[no].GetQuestion()); root.Nodes.Add(tn); treeView1.Nodes.Add(root); //добавил две ветви в корень //теперь в эти две ветви нужно добавить ихние ветви (то есть 3 уровень) а в те ветви ихние ветви пока не достигнем конца (цели), но как? //кстати вылазит ошибка на последней строке ArgumentException - невозможно добавить или вставить элемент "Root" в несколько позиций } вот выходит такое, дальше ошибка выскакивает и т.д., короче только до второго уровня дохожу и всё
Короче пошарился в интернете подсказали что лучше в xml держать данные и от туда уже тянуть в XmlNode потом из него в TreeNode, вот что вышло: Code: XmlDocument doc = new XmlDocument(); doc.Load("Sample.xml"); XmlNodeList nl = doc.DocumentElement.SelectNodes("parent"); foreach (XmlNode n in nl) { TreeNode node = new TreeNode(); node.Text = n.SelectSingleNode("question").InnerText; node.Tag = n.OuterXml; treeView1.Nodes.Add(node); } Вот фрагмент xml-файла: вот только результат выходит не деревом: