///////////////////////////////////////////// public static ANode TreeDomen(string[] B) //создаёт дерево доменов { ANode treeDomen = new ANode(); //дерево доменов // int count1; string str; for (int i = 0; i < B.Length; i++) //перебираем массив В { str = Solution.TreeList(B[i], 0); //нулевая зона домена B[i] treeDomen.Insert(str, B[i], treeDomen); } return(treeDomen); }
// dataZone -вставляемая зона домена В[i], dataDomen- вставляемый домен B[i] public void Insert(string dataZone, string dataDomen, ANode node, int depth = 0) // вставка в дерево зоны домена. depth глубина вставки { int count1 = 0; //количество точек в домене B[i] string str2; bool fl; ArrayList treeList2 = new ArrayList();; ArrayList list2; bool fl2 = false; for (int i3 = 0; i3 < dataDomen.Length; i3++) { if (dataDomen[i3] == '.') { count1++; } } if (tree1.Count == 0)//если записей нет { //node.tree1 = new Dictionary<string, ArrayList>(); if (count1 - depth == 1) //если во вставляемом домене только две зоны, то в значение словаря вставляем домен { treeList2.Add(dataDomen); } else { str2 = Solution.TreeList(dataDomen, depth + 1);//следующая вставляемая зона ANode node2 = new ANode(); Insert(str2, dataDomen, node2, depth + 1); treeList2.Add(node2); } node.tree1.Add(dataZone, treeList2); return; } else { //.....находим совпадение с ключом ---если есть совпадение нужно искать в следующей зоне совпадение ключей ////////////////////////////////////////////////////////////////////////////////////////////////////////////// fl = false; foreach (string c in node.tree1.Keys) { if (dataZone == c) { fl = true; break; } } if (fl == false) { //node.tree1 = new Dictionary<string, ArrayList>(); if (count1 - depth == 1) //если во вставляемом домене только две зоны, то в значение словаря вставляем домен { treeList2.Add(dataDomen); } else { str2 = Solution.TreeList(dataDomen, depth + 1);//следующая вставляемая зона ANode node2 = new ANode(); Insert(str2, dataDomen, node2, depth + 1); treeList2.Add(node2); } node.tree1.Add(dataZone, treeList2); return; } else { if (count1 - depth == 1) //если во вставляемом домене только две зоны, то в значение словаря вставляем домен { list2 = node.tree1[dataZone]; node.tree1.Remove(dataZone); list2.Add(dataDomen); } else { str2 = Solution.TreeList(dataDomen, depth + 1); //следующая вставляемая зона ANode node2 = new ANode(); list2 = node.tree1[dataZone]; //////////получение списка доменов по ключу foreach (object o in list2) { var c = o.GetType(); bool ff = c.Equals(typeof(ANode)); if (ff == true) { fl2 = false; ANode N = new ANode(); N = (ANode)o; foreach (string st in N.tree1.Keys) { if (str2 == st) { node2 = N; fl2 = true; break; } } if (fl2 == true) { break; } } } Insert(str2, dataDomen, node2, depth + 1); //list2 = node.tree1[dataZone]; node.tree1.Remove(dataZone); if (fl2 == false) { list2.Add(node2); } } node.tree1.Add(dataZone, list2); return; } } }
////////////////////////////////////////////// //str проверяемый хост, ptr проверяемый узел дерева, depth номер зоны, l глубина дерева public static bool l_tree(string str, ANode ptr, int depth, int l = 0) // { ArrayList AList; bool fl = false; bool fl2 = false; string str1 = TreeList(str, depth); int count1 = 0;//количество точек в домене A[i]-- количество зон = count1+1 for (int i3 = 0; i3 < str.Length; i3++) { if (str[i3] == '.') { count1++; } } // .... перебираем ключи в словаре узла дерева доменов foreach (string str3 in ptr.tree1.Keys) { if (str1 == str3) //ищем совпадение зоны c ключом { fl = true; //нашли совпадение break; } else { fl = false; } } if (fl == true) //если есть ключ совпадающий с зоной хоста { AList = ptr.tree1[str1]; //получение списка доменов по ключу str1 str1 = TreeList(str, depth + 1); //переход к следующей зоне хоста A[i] ////////....сначала проверяем все строки из списка узла текущего ключа, если хост подддомен то дальше не проверяем foreach (object o in AList) /////Получаем объекты из дерева доменов в узле по предыдущему ключу str1 { var c = o.GetType(); bool ff = c.Equals(typeof(ANode)); if (ff == false) //если объект - строка (домен) { string str5; str5 = (string)o; bool result = eq(str, str5); if (result == true) { fl = true; return(fl); } } } /////...если в строках не найдено домена ищем дальше в словарях узлов. ANode node2 = new ANode(); foreach (object o in AList) /////Получаем объекты из дерева доменов в узле по предыдущему ключу str1 { var c = o.GetType(); bool ff = c.Equals(typeof(ANode)); if (ff == true) //если объект не строка(не домен) { fl2 = false; ANode N = new ANode(); N = (ANode)o; foreach (string st in N.tree1.Keys) //перебираем ключи в следующем узле { int result = String.Compare(str1, st); if (result == 0) { node2 = N; fl2 = true; break; } } if (fl2 == true) { fl = fl2; break; } } } if (fl == true) { fl = l_tree(str, node2, depth + 1, l + 1); } } return(fl); }