Browse Source

XML Parser: GetSelfAndAllChildren optimized by reusing Daniel's Flatten function

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4664 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
David Srbecký 17 years ago
parent
commit
be29c1abd8
  1. 38
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/XmlParser/RawObjects.cs

38
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/XmlParser/RawObjects.cs

@ -287,10 +287,7 @@ namespace ICSharpCode.AvalonEdit.XmlParser @@ -287,10 +287,7 @@ namespace ICSharpCode.AvalonEdit.XmlParser
/// <inheritdoc/>
public override IEnumerable<RawObject> GetSelfAndAllChildren()
{
return Enumerable.Union(
new RawContainer[] { this },
this.Children.SelectMany(x => x.GetSelfAndAllChildren())
);
return new RawObject[] { this }.Flatten(i => i is RawContainer ? ((RawContainer)i).Children : null);
}
/// <summary>
@ -979,4 +976,37 @@ namespace ICSharpCode.AvalonEdit.XmlParser @@ -979,4 +976,37 @@ namespace ICSharpCode.AvalonEdit.XmlParser
return string.Format("[{0} Text.Length={1}]", base.ToString(), this.EscapedValue.Length);
}
}
static class ExtensionMethods
{
// Copied from ICSharpCode.SharpDevelop.Dom.ExtensionMethods
/// <summary>
/// Converts a recursive data structure into a flat list.
/// </summary>
/// <param name="input">The root elements of the recursive data structure.</param>
/// <param name="recursion">The function that gets the children of an element.</param>
/// <returns>Iterator that enumerates the tree structure in preorder.</returns>
public static IEnumerable<T> Flatten<T>(this IEnumerable<T> input, Func<T, IEnumerable<T>> recursion)
{
Stack<IEnumerator<T>> stack = new Stack<IEnumerator<T>>();
try {
stack.Push(input.GetEnumerator());
while (stack.Count > 0) {
while (stack.Peek().MoveNext()) {
T element = stack.Peek().Current;
yield return element;
IEnumerable<T> children = recursion(element);
if (children != null) {
stack.Push(children.GetEnumerator());
}
}
stack.Pop().Dispose();
}
} finally {
while (stack.Count > 0) {
stack.Pop().Dispose();
}
}
}
}
}

Loading…
Cancel
Save