示例#1
0
文件: Solution.cs 项目: drug173/Tests
        /////////////////////////////////////////////
        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);
        }
示例#2
0
文件: ANode.cs 项目: drug173/Tests
        // 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;
                }
            }
        }
示例#3
0
文件: Solution.cs 项目: drug173/Tests
        //////////////////////////////////////////////
        //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);
        }