private bool ContainsPath(JToken token, IExpressionChain selector) { switch (token.Type) { case JTokenType.Object: { var matchingChild = token.Children <JProperty>().FirstOrDefault(c => string.Equals(c.Name, selector.Current.Name, StringComparison.InvariantCultureIgnoreCase)); if (matchingChild == null) { return(false); } return(!selector.HasNext() || ContainsPath(matchingChild.Value, selector.Next)); } case JTokenType.Array: { return(((JArray)token).All(child => ContainsPath(child, selector))); } default: return(true); } }
public bool Contains(IExpressionChain chain) { return(chain == null || (chain.Current.Equals(Current) && (chain.Next == null || (Next != null && Next.Contains(chain.Next))))); }
public static bool HasNext(this IExpressionChain chain) => chain?.Next != null;