Send to your Kindle static public PageElement Merge(PageElement[] elements) { var target = elements.First(); Debug.Assert(target is PageElements.Notations.Ol); foreach (var elem in elements.Skip(1)) { Debug.Assert(elem is PageElements.Notations.Ol); target.Children.AddRange(elem.Children); } { var elements_ = new List<PageElement>(); var buf = new List<PageElement>(); foreach (var li in target.Children.Where(e => e is PageElements.Notations.Li)) { foreach (var c in li.Children) { if (c is PageElements.Notations.Ol) { buf.Add(c); } else if (buf.Count > 0) { elements_.Add(Merge(buf.ToArray())); buf.Clear(); } else { elements_.Add(c); } } li.Children.Clear(); li.Children.AddRange(elements_); elements_.Clear(); } } } static public PageElement Merge(PageElement[] elements) { var target = elements.First(); Debug.Assert(target is PageElements.Notations.Ol); foreach (var elem in elements.Skip(1)) { Debug.Assert(elem is PageElements.Notations.Ol); target.Children.AddRange(elem.Children); } { var elements_ = new List<PageElement>(); var buf = new List<PageElement>(); foreach (var li in target.Children.Where(e => e is PageElements.Notations.Li)) { foreach (var c in li.Children) { if (c is PageElements.Notations.Ol) { buf.Add(c); } else if (buf.Count > 0) { elements_.Add(Merge(buf.ToArray())); buf.Clear(); } else { elements_.Add(c); } } li.Children.Clear(); li.Children.AddRange(elements_); elements_.Clear(); } } }