//удаляет нулевых детей =) public static void DelNullChilds(TagItem tag) { for (int i = 0; i < tag.childrens.Count; i++) { if (tag.childrens[i] == null) { tag.childrens.RemoveAt(i); } } }
/// <summary> /// Поиск по имени тега /// </summary> /// <param name="tag"></param> /// <param name="str"></param> /// <returns></returns> //public TagItem FindTag(TagItem tag, string str) //{ // TagItem help = tag; // if (help.name.CompareTo(str) == 0) // { // findOk = true; //##криво. // find = help; // return help; // } // if (help.left != null && !findOk) FindTag(help.left, str); // if (help.right != null && !findOk) FindTag(help.right, str); // if (findOk) return find; // else return null; //} /// <summary> /// добавление тега /// </summary> //public void AddTagItem(TagItem tag) //{ // TagItem addItem = new TagItem(); // addItem = WriteTagData(addItem); // if (tag.left == null) // { // tag.left = addItem; // return; // } // if (tag.right == null) // { // tag.right = addItem; // return; // } // addItem.left = tag.left; // tag.left = addItem; // Console.WriteLine("Тег добавлен!"); // return; //} /// <summary> /// Метод удаления тега. /// </summary> /// <param name="tag">откуда его удаляем</param> /// <param name="delTag">какой тэг удаляем</param> //public TagItem DelTagItem(TagItem tag, TagItem delTag) //{ // string[] arrNames = delTag.Fullpath.Split('.'); //из свойства Путь нашего тэга находим его родителя // string parentName = arrNames[arrNames.Length - 2]; // findOk = false; // TagItem parentTag = FindTag(tag, parentName); // if (delTag.left == null && delTag.right == null) //если у удаляемого нет наследников - всё зачищаем // { // if (parentTag.left == delTag) parentTag.left = null; // if (parentTag.right == delTag) parentTag.right = null; // } // if (delTag.left == null && delTag.right != null) //если у удаляемого есть наследник справа - добавляем его к родителю // { // if (parentTag.left == delTag) parentTag.left = delTag.right; // if (parentTag.right == delTag) parentTag.right = delTag.right; // } // if (delTag.left != null && delTag.right == null) //если у удаляемого есть наследник слева - добавляем его к родителю // { // if (parentTag.left == delTag) parentTag.left = delTag.left; // if (parentTag.right == delTag) parentTag.right = delTag.left; // } // if (delTag.left != null && delTag.right != null) //если у удаляемого есть ОБА наследника - добавляем одного к родителю, второго куда ни будь в конец // { // if (parentTag.left == delTag) // { // parentTag.left = delTag.left; // TagItem end = FindEndOfBranch(delTag); // end.left = delTag.right; // } // if (parentTag.right == delTag) // { // parentTag.right = delTag.right; // TagItem end = FindEndOfBranch(delTag); // end.left = delTag.left; // } // } // Console.WriteLine("Тег удалён!"); // return tag; //} /// <summary> /// Метод для нахождения конца ветки /// </summary> /// <param name="tag">откуда будем искать</param> /// <returns></returns> //TagItem FindEndOfBranch(TagItem tag) //{ // TagItem end = tag; // do // { // end = end.left; // } while (end.left != null); // return end; //} /// <summary> /// Прописываем пути и Level у каждого тега /// </summary> /// <param name="tag"></param> /// <param name="prev"></param> //public static void SetPaths(TagItem tag, string prev, int l = 1) //{ // if (tag != null) // { // if (prev.CompareTo("first") == 0) // { // tag.Fullpath = tag.name; // tag.Level = 1; // } // else // { // tag.Fullpath = $"{prev}.{tag.name}"; // tag.Level = ++l; // } // SetPaths(tag.left, tag.Fullpath, tag.Level); // SetPaths(tag.right, tag.Fullpath, tag.Level); // } //} /// <summary> /// сохраняем в файл /// </summary> /// <param name="tag"></param> public void SaveTree(TagItem tag, string savePath) { XmlSerializer formatter = new XmlSerializer(typeof(TagItem)); using (FileStream fs = new FileStream(savePath, FileMode.OpenOrCreate)) { formatter.Serialize(fs, tag); //Console.WriteLine($@"Дерево сохранено в {savePath}."); } }
/// <summary> /// читаем из файла /// </summary> /// <returns></returns> public TagItem LoadTree(string loadPath) { XmlSerializer formatter = new XmlSerializer(typeof(TagItem)); using (FileStream fs = new FileStream(loadPath, FileMode.OpenOrCreate)) { TagItem newTagItems = (TagItem)formatter.Deserialize(fs); Console.WriteLine($@"Дерево прочитано из {loadPath}."); return(newTagItems); } }
/// <summary> /// Печатает структуру дерева /// </summary> /// <param name="tag"></param> /// <param name="l">отступ от левого края</param> //public static void ShowTree(TagItem tag, int l) //{ // if (tag != null) // { // ShowTree(tag.left, l + 10);//переход к левому поддереву // for (int i = 0; i < l; i++) Console.Write(" "); // Console.WriteLine($"{tag.name}: {tag.data} L{tag.Level}"); //сюда можно добавить поля, которые необходимо видеть при печати // ShowTree(tag.right, l + 10);//переход к правому поддереву // } //} /// <summary> /// Вывод построчного списка тэгов – полный путь, уровень вложенности, тип, значение; /// </summary> /// <param name="tag"></param> public static void ShowTreeInLine(TagItem tag) { if (tag.childrens != null) { foreach (TagItem item in tag.childrens) { if (item == null) { break; } Console.WriteLine($"{item.Fullpath}, L{item.Level}, {item.ShowType(item)}, {item.data} "); ShowTreeInLine(item); } } }
/// <summary> /// Метод изменения имени тега /// </summary> /// <param name="tag">тег, имя которого надо изменить</param> /// <returns></returns> public void ChangeTagName(TagItem tag) { bool ok = false; string newName; Console.WriteLine($"Введите новое имя тэга {tag.name}:"); do { newName = Console.ReadLine(); //проверяем на пустую строку или пробел - не очень названия для тега, думаю if (newName.CompareTo("") == 0 || newName.CompareTo(" ") == 0 || newName.Length < 2) //ну и длинна должна быть больше 2х символов { ok = false; } else { ok = true; } } while (!ok); tag.name = newName; }
/// <summary> /// Возвращает тип значения тэга /// </summary> /// <param name="tag"></param> /// <returns></returns> public string ShowType(TagItem tag) { string type = "none";//тип значения if (tag.data is double) { type = "double"; } if (tag.data is int) { type = "int"; } if (tag.data is bool) { type = "bool"; } if (tag.data == null) { type = "none"; } return(type); }
/// <summary> /// Обновление путей в дереве /// </summary> /// <param name="tagTree"></param> public static void UpdatePaths(TagItem tagTree, string path = "first", int setLevel = 1) { if (path.CompareTo("first") == 0) { tagTree.Fullpath = tagTree.Name; tagTree.Level = setLevel; } else { tagTree.Fullpath = $"{path}.{tagTree.Name}"; } if (tagTree.childrens == null) //проверка, если потомков нет - не выполняем дальше { return; } for (int nmbrOfChldrns = 0; nmbrOfChldrns < tagTree.ChildrensList.Count; nmbrOfChldrns++) { if (tagTree.childrens[nmbrOfChldrns] == null) //проверка, если один из потомков нулевой - пропускаем его { continue; } UpdatePaths(tagTree.ChildrensList[nmbrOfChldrns], tagTree.Fullpath, tagTree.Level + 1); } }
/// <summary> /// Возвращает значение тэга /// </summary> /// <param name="tag"></param> /// <returns></returns> public object ReadTagData(TagItem tag) { return(tag.data); }
public TagStorage(TagItem tagTree) { Root = new TagItem(); Root.ChildrensList.Add(tagTree); }
public TagStorage() { Root = new TagItem(); }
static void Main(string[] args) { int n; TagItem tagTree = new TagItem(); do { PrintMenu(); n = Vvod(7); switch (n) { case 1: //1. Сформировать дерево. { Console.WriteLine("Сколько элементов будет в дереве?"); int k = Vvod(40); //здесь ограничение на макс. 40 элементов tagTree = TagItem.AddElement(k, "first"); //TagItem.SetPaths(tagTree, "first"); //прописываем пути с первого break; } case 2: //2. Загрузка / выгрузка дерева тэгов(D:\Tags.xml); { Console.WriteLine("Загрузка/сохранение дерева тэгов:\n1.Загрузить.\n2.Сохранить.\n0.Выход."); int k = Vvod(3); if (k == 1) { tagTree = tagTree.LoadTree(@"D:\Tags.xml"); //Загрузка из XML //TagItem.ShowTree(tagTree, 10); } if (k == 2) { tagTree.SaveTree(tagTree, @"D:\Tags.xml"); //Сохранение в XML } break; } case 3: //3. Вывод построчного списка тэгов – полный путь, уровень вложенности, тип, значение; { Console.WriteLine("Печать тегов:\n1.В виде дерева.\n2.Построчно.\n0.Выход."); int k = Vvod(3); if (k == 1) { // TagItem.ShowTree(tagTree, 10); //вывод деревом } if (k == 2) { TagItem.ShowTreeInLine(tagTree); //вывод построчно } break; } case 4: //4. Удаление тэга по имени; { //Console.WriteLine("Введите имя тега, который удаляем:"); //string name = Console.ReadLine(); //TagItem.findOk = false; //TagItem find = tagTree.FindTag(tagTree, name); //ищем этот тег //if (find != null) // Console.WriteLine($"Найден тег {name}:{find.ReadTagData(find)}"); //else // Console.WriteLine($"Тег {name} не найден!"); //tagTree = tagTree.DelTagItem(tagTree, find); //TagItem.SetPaths(tagTree, "first"); //перепрописываем пути с первого после удаления ////TagItem.ShowTree(tagTree, 10); break; } case 5: //5. Добавление нового тэга. { //Console.WriteLine("Куда добавить тег?"); //string name = Console.ReadLine(); //TagItem.findOk = false; //TagItem find = tagTree.FindTag(tagTree, name); //ищем этот тег //if (find != null) // Console.WriteLine($"Найден тег {name}:{find.ReadTagData(find)}"); //else // Console.WriteLine($"Тег {name} не найден!"); //find.AddTagItem(find); ////TagItem.ShowTree(tagTree, 10); break; } case 6: //6. Переименование тэга. { //Console.WriteLine("Введите имя тега, который переименовываем?"); //string name = Console.ReadLine(); //TagItem.findOk = false; //TagItem find = tagTree.FindTag(tagTree, name); //ищем этот тег //if (find != null) // Console.WriteLine($"Найден тег {name}:{find.ReadTagData(find)}"); //else // Console.WriteLine($"Тег {name} не найден!"); //find.ChangeTagName(find); //TagItem.SetPaths(tagTree, "first"); //перепрописываем пути с первого после переименования тега //TagItem.ShowTree(tagTree, 10); break; } } } while (n != 0); //TagStorage Root = new TagStorage(); //Root.Root = tagTree; //пихаем в корень наше дерево. // }