Цель создать "библиотеку" типа:
для слова ааа будет выглядеть
Код:
<root>
<a>
<a>
<a>
aaa
</a>
</a>
</a>
</root>
Все работает как нужно, но время создания.... 100 тыс слов ...3 часа..., а нужно 10 000 000 =)) (может есть идейки как оптимизировать=))
Основной класс:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.IO;
namespace CreationLib_test3
{
public class myClass
{
public myClass()
{
CreationWords CW = new CreationWords();
string path = "Library3.lib";
Console.WriteLine("Открытие библиотеки {0}", path);
XmlDocument document = new XmlDocument();
bool pLoad = false;
try
{
document.Load(path);
Console.WriteLine("Библиотека открыта.");
}
catch
{
Console.WriteLine("Не смогли открыть...");
using (StreamWriter sw = File.CreateText(path))
{
sw.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
sw.WriteLine("<words>");
sw.WriteLine("</words>");
}
Console.WriteLine("Создали новую...");
document.Load(path);
Console.WriteLine("Открытие...");
}
XmlNode root = document.DocumentElement;
Console.WriteLine("Создание библиотеки...");
DateTime startTime = DateTime.Now;
#region create
for (int y = 0; y < 100000; y++)
{
string s = CW.World();
//Console.WriteLine("Слово для добавления: {0}", s);
string code = "//words";//root структура
for (int i = 0; i < s.Length; i++)
{
code += "/" + s[i];
}
XmlNode node = root.SelectSingleNode(code);
XmlText ss = document.CreateTextNode(s);
int index = 0;
if (node == null)
{
code = code.Remove(code.Length - 1 - 1); //вместо одного можно возвращать маску длинны на эту букву + "/" (1)
index = 1;
node = root.SelectSingleNode(code);
//--------------------
//Вот это тяжелое место... возможно я изобретаю велосипед....
while (true)
{
if (node != null && code.Length >= 5)
{
//Console.WriteLine("По Вашему запросу найдена структура: {0} | index={1}", code, index.ToString());
break;
}
//Console.WriteLine("Ищем по древу структуру: {0}", code);
code = code.Remove(code.Length - 1 - 1);
node = root.SelectSingleNode(code);
index += 1;
}
//--------------------
//Console.WriteLine("Находимся в структуре: {0}", code);
if (node != null)
{
//Console.WriteLine("Достраиваем структуру (index={0} root={1}):", index, code);
//Достраиваем структуру
for (int i = index; i > 0; i--)
{
//Console.WriteLine("CreateElement: {0}", s[s.Length - i].ToString());
XmlElement newNode = document.CreateElement(s[s.Length - i].ToString());
node = node.InsertAfter(newNode, node.LastChild);
}
//Добовляем текст(структуру текста)
//Console.WriteLine("Добовляем текст: {0}", s);
XmlText newText = document.CreateTextNode(s);
node.InsertAfter(newText, node.LastChild);
}
}
else
{
//Если нашли такую структуру
//Console.WriteLine("Такая структура с таким словом уже есть");
}
}
#endregion
Console.WriteLine("Библиотека создана.");
Console.WriteLine("Время создание библиотеки: {0}", (DateTime.Now - startTime).ToString());
document.Save(path);
}
}
}