/// <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)); }