/// <summary>
        /// Casts the enumeration value of known types into the matching character set.
        /// </summary>
        /// <returns></returns>
        public static LexicalCharacterSet ToCharacterSet(this LexicalCharacterSetType knownType)
        {
            switch (knownType)
            {
            case LexicalCharacterSetType.Numeric:
                return(LexicalCharacterSet.Numeric);

            case LexicalCharacterSetType.AsciiAlpha:
                return(LexicalCharacterSet.AsciiAlpha);

            case LexicalCharacterSetType.AsciiAlphaNumeric:
            case LexicalCharacterSetType.AsciiAuto:
                return(LexicalCharacterSet.AsciiAlphaNumeric);

            default:
                throw new ArgumentException(String.Format("LexicalCharacterSetType '{0}' cannot be converted directly to a character set.", knownType));
            }
        }
        /// <summary>
        /// Casts the enumeration value of known types into the matching character set.
        /// </summary>
        /// <returns></returns>
        public static LexicalCharacterSet ToCharacterSet(this LexicalCharacterSetType knownType, String matching, bool ignoreCase)
        {
            var chars = matching.ToCharArray().ToList();

            if (knownType == LexicalCharacterSetType.Numeric)
            {
                if (chars.All(value => LexicalCharacterSet.Numeric.Characters.Contains(value) || char.IsWhiteSpace(value)))
                {
                    return(LexicalCharacterSet.Numeric);
                }
                throw new ArgumentException(
                          "The source string contains characters not available in the specified lexical character set.");
            }
            if (knownType == LexicalCharacterSetType.AsciiAlpha)
            {
                if (ignoreCase && chars.All(value => LexicalCharacterSet.AsciiAlphaUpper.Characters.Contains(value) || char.IsWhiteSpace(value)))
                {
                    return(LexicalCharacterSet.AsciiAlphaUpper);
                }
                if (ignoreCase && chars.All(value => LexicalCharacterSet.AsciiAlphaLower.Characters.Contains(value) || char.IsWhiteSpace(value)))
                {
                    return(LexicalCharacterSet.AsciiAlphaLower);
                }
                if (chars.All(value => LexicalCharacterSet.AsciiAlpha.Characters.Contains(value) || char.IsWhiteSpace(value)))
                {
                    return(LexicalCharacterSet.AsciiAlpha);
                }
                throw new ArgumentException(
                          "The source string contains characters not available in the specified lexical character set.");
            }
            if (knownType == LexicalCharacterSetType.AsciiAlphaNumeric)
            {
                if (ignoreCase && chars.All(value => LexicalCharacterSet.AsciiAlphaNumericUpper.Characters.Contains(value) || char.IsWhiteSpace(value)))
                {
                    return(LexicalCharacterSet.AsciiAlphaNumericUpper);
                }
                if (ignoreCase && chars.All(value => LexicalCharacterSet.AsciiAlphaNumericLower.Characters.Contains(value) || char.IsWhiteSpace(value)))
                {
                    return(LexicalCharacterSet.AsciiAlphaNumericLower);
                }
                if (chars.All(value => LexicalCharacterSet.AsciiAlphaNumeric.Characters.Contains(value) || char.IsWhiteSpace(value)))
                {
                    return(LexicalCharacterSet.AsciiAlphaNumeric);
                }
                throw new ArgumentException(
                          "The source string contains characters not available in the specified lexical character set.");
            }

            foreach (var charSet in LexicalCharacterSet.KnownCharacterSets)
            {
                //only allow pick of 'upper' and 'lower' case character sets if ignore case is set
                if (!ignoreCase && !charSet.IsCaseSensitive && charSet.Characters.Any(char.IsLetter))
                {
                    continue;
                }

                if (chars.All(value => charSet.Characters.Contains(value) || char.IsWhiteSpace(value)))
                {
                    return(charSet);
                }
            }
            throw new ArgumentException(
                      "The source string contains characters not available in any known (pre-defined) lexical character set.");
        }