Ejemplo n.º 1
0
 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;
 }
Ejemplo n.º 2
0
        // 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));
        }
Ejemplo n.º 3
0
        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));
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
            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);
            }