/// <summary>
    /// Builds a predicate from multiple character types
    /// </summary>
    /// <param name="charTypes"></param>
    /// <returns></returns>
    private static Func <char, bool> CharFunc(CharTypes charTypes)
    {
        var predicates = new Collection <Func <char, bool> >();

        // Letters or Digits
        if (charTypes.HasFlags(CharTypes.LettersOrDigits))
        {
            predicates.Add(char.IsLetterOrDigit);
        }
        else if (charTypes.HasFlags(CharTypes.Letters))
        {
            predicates.Add(char.IsLetter);
        }
        else if (charTypes.HasFlags(CharTypes.Digits))
        {
            predicates.Add(char.IsDigit);
        }

        // XML
        if (charTypes.HasFlags(CharTypes.XmlChar))
        {
            predicates.Add(XmlConvert.IsXmlChar);
        }

        // White space
        if (charTypes.HasFlags(CharTypes.WhiteSpace))
        {
            predicates.Add(char.IsWhiteSpace);
        }

        switch (predicates.Count)
        {
        case 1: return(predicates[0]);

        case 2: return(c => predicates[0](c) || predicates[1](c));

        case 3: return(c => predicates[0](c) || predicates[1](c) || predicates[2](c));
        }
        return(null);

        // //unfortunately, this slows things way down - if anyone knows of a better
        // //way to combine predicates, please weigh in!
        //return c => predicates.Any(p => p(c));
    }