Example #1
0
        public void FillLink(TypeOfActionXml typeOfActionXml)
        {
            if (LinkTags != null)
            {
                var dicToCompail = LinkTags.ToDictionary(l => l.Tag, l => l);

                // заполняем дерево ссылками на следующие и предыдущие элементы
                foreach (var l in LinkTags)
                {
                    LiteratureTag nextTag = null;
                    dicToCompail.TryGetValue(l.Ref, out nextTag);
                    if (nextTag != null && l.PreviousNode == null && (l.NextNodeEmpty() && typeOfActionXml == TypeOfActionXml.Separete ||
                                                                      typeOfActionXml == TypeOfActionXml.UnionTree))
                    {
                        nextTag.AddNextNode(l);
                        l.PreviousNode = nextTag;
                    }
                }

                //разрываем циклическую ссылку
                if (typeOfActionXml == TypeOfActionXml.UnionTree)
                {
                    if (LinkTags != null && LinkTags.Count > 0)
                    {
                        SeparateLink(LinkTags.First());
                    }
                }
            }
        }
Example #2
0
 public void AddNextNode(LiteratureTag literatureTag)
 {
     if (NextNodes == null)
     {
         NextNodes = new List <LiteratureTag>();
     }
     NextNodes.Add(literatureTag);
 }
Example #3
0
        private void SeparateLink(LiteratureTag literatureTag)
        {
            //находим корневой элемент цепи или разрываем цепь
            var lFirst = literatureTag;
            HashSet <string> containStrinhg = new HashSet <string>();

            while (lFirst != null)
            {
                bool nullTag = false;
                var  node    = lFirst;
                if (containStrinhg.Contains(lFirst.Tag))
                {
                    nullTag = true;
                }
                else
                {
                    containStrinhg.Add(lFirst.Tag);
                }

                lFirst = lFirst.PreviousNode;

                if (nullTag == true)
                {
                    node.PreviousNode = null;
                }
            }

            // разрываем дочерние цепи
            var linkedList = LinkTags?.Where(l => l.PreviousNode == null).ToList();

            foreach (var link in linkedList)
            {
                lFirst = link;
                HashSet <string> tagContain = new HashSet <string>()
                {
                    link.Tag
                };
                SeparateLink(lFirst, tagContain);
            }
        }
Example #4
0
 private void SeparateLink(LiteratureTag lFirst, HashSet <string> tagContain)
 {
     if (lFirst.NextNodes != null && lFirst.NextNodes.Count > 0)
     {
         List <LiteratureTag> removeTag = new List <LiteratureTag>();
         foreach (var next in lFirst.NextNodes)
         {
             if (next != null)
             {
                 if (tagContain.Contains(next.Tag))
                 {
                     removeTag.Add(next);
                 }
                 else
                 {
                     tagContain.Add(next.Tag);
                     SeparateLink(next, tagContain);
                 }
             }
         }
         lFirst.NextNodes.RemoveAll(next => removeTag.Contains(next));
     }
 }