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()); } } } }
public void AddNextNode(LiteratureTag literatureTag) { if (NextNodes == null) { NextNodes = new List <LiteratureTag>(); } NextNodes.Add(literatureTag); }
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); } }
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)); } }