public UnionIteratorN(UnionIterator <TSource> previous, IEnumerable <TSource> next, int nextIndex) : base(previous._comparer) { Debug.Assert(next != null); Debug.Assert(nextIndex > 1); _previous = previous; _next = next; _nextIndex = nextIndex; }
// Invoked from XsltKey (XPathFunction) public BaseIterator Evaluate(BaseIterator iter, Expression valueExpr) { XPathNodeIterator i = iter; if (iter.CurrentPosition == 0) { i = iter.Clone(); i.MoveNext(); } XPathNavigator nav = i.Current; object o = valueExpr.Evaluate(iter); XPathNodeIterator it = o as XPathNodeIterator; XsltContext ctx = iter.NamespaceManager as XsltContext; BaseIterator result = null; if (it != null) { while (it.MoveNext()) { ArrayList nodes = GetNodesByValue( nav, it.Current.Value, ctx); if (nodes == null) { continue; } ListIterator tmp = new ListIterator(nodes, ctx); if (result == null) { result = tmp; } else { result = new UnionIterator( iter, result, tmp); } } } else { ArrayList nodes = GetNodesByValue( nav, XPathFunctions.ToString(o), ctx); if (nodes != null) { result = new ListIterator(nodes, ctx); } } return(result != null ? result : new NullIterator(iter)); }
public static IEnumerable <TSource> Union <TSource>(this IEnumerable <TSource> first, IEnumerable <TSource> second, IEqualityComparer <TSource> comparer) { if (first == null) { throw Error.ArgumentNull("first"); } if (second == null) { throw Error.ArgumentNull("second"); } UnionIterator <TSource> union = first as UnionIterator <TSource>; return(union != null && EquivalentEqualityComparers(comparer, union._comparer) ? union.Union(second) : new UnionIterator2 <TSource>(first, second, comparer)); }
public BaseIterator Evaluate(BaseIterator iter, Expression valueExpr) { XPathNodeIterator xpathNodeIterator = iter; if (iter.CurrentPosition == 0) { xpathNodeIterator = iter.Clone(); xpathNodeIterator.MoveNext(); } XPathNavigator xpathNavigator = xpathNodeIterator.Current; object obj = valueExpr.Evaluate(iter); XPathNodeIterator xpathNodeIterator2 = obj as XPathNodeIterator; XsltContext nsm = iter.NamespaceManager as XsltContext; BaseIterator baseIterator = null; if (xpathNodeIterator2 != null) { while (xpathNodeIterator2.MoveNext()) { XPathNavigator xpathNavigator2 = xpathNodeIterator2.Current; ArrayList nodesByValue = this.GetNodesByValue(xpathNavigator, xpathNavigator2.Value, nsm); if (nodesByValue != null) { ListIterator listIterator = new ListIterator(nodesByValue, nsm); if (baseIterator == null) { baseIterator = listIterator; } else { baseIterator = new UnionIterator(iter, baseIterator, listIterator); } } } } else if (xpathNavigator != null) { ArrayList nodesByValue2 = this.GetNodesByValue(xpathNavigator, XPathFunctions.ToString(obj), nsm); if (nodesByValue2 != null) { baseIterator = new ListIterator(nodesByValue2, nsm); } } return((baseIterator == null) ? new NullIterator(iter) : baseIterator); }
internal override IEnumerable <TSource> GetEnumerable(int index) { if (index > _nextIndex) { return(null); } UnionIteratorN <TSource> union = this; while (index < union._nextIndex) { UnionIterator <TSource> previous = union._previous; union = previous as UnionIteratorN <TSource>; if (union == null) { Debug.Assert(index == 0 || index == 1); Debug.Assert(EquivalentEqualityComparers(_comparer, previous._comparer)); return(previous.GetEnumerable(index)); } } return(union._next); }