CompositeExpression
using System;
using System.Collections.Generic;
namespace Newtonsoft.Json.Linq.JsonPath
{
    internal class CompositeExpression : QueryExpression
    {
        public List<QueryExpression> Expressions { get; set; }
        public CompositeExpression()
        {
            Expressions = new List<QueryExpression>();
        }
        public override bool IsMatch(JToken root, JToken t)
        {
            List<QueryExpression>.Enumerator enumerator;
            switch (base.Operator) {
            case QueryOperator.And:
                enumerator = Expressions.GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        if (!enumerator.Current.IsMatch(root, t))
                            return false;
                    }
                } finally {
                    ((IDisposable)enumerator).Dispose();
                }
                return true;
            case QueryOperator.Or:
                enumerator = Expressions.GetEnumerator();
                try {
                    while (enumerator.MoveNext()) {
                        if (enumerator.Current.IsMatch(root, t))
                            return true;
                    }
                } finally {
                    ((IDisposable)enumerator).Dispose();
                }
                return false;
            default:
                throw new ArgumentOutOfRangeException();
            }
        }
    }
}