internal new static WildcardSharpElement Create(string pattern, ref int patternIndex)
            {
                patternIndex++;

                var element = new WildcardSharpElement();

                element.Next = WildcardElement.Create(pattern, ref patternIndex);

                return(element);
            }
        private WildcardElement Build()
        {
            string pattern = _pattern;

            if (_caseInsensitive)
            {
                pattern = pattern.ToLower();
            }

            int patternIndex = 0;

            return(WildcardElement.Create(pattern, ref patternIndex));
        }
            internal new static WildcardStringElement Create(string pattern, ref int patternIndex)
            {
                int patternLength = pattern.Length;
                var builder       = new StringBuilder(patternLength - patternLength);

                while (patternIndex < patternLength)
                {
                    switch (pattern[patternIndex])
                    {
                    case '\\':
                    {
                        patternIndex++;

                        if (patternIndex < patternLength)
                        {
                            builder.Append(pattern[patternIndex++]);
                        }
                    }
                        continue;

                    case '*':
                    case '?':
                    case '#':
                    case '[':
                        break;

                    default:
                    {
                        builder.Append(pattern[patternIndex++]);
                    }
                        continue;
                    }

                    break;
                }

                var element = new WildcardStringElement();

                element.Pattern = builder.ToString();
                element.Next    = WildcardElement.Create(pattern, ref patternIndex);

                return(element);
            }
            internal new static WildcardRangeElement Create(string pattern, ref int patternIndex)
            {
                patternIndex++;
                int patternLength = pattern.Length;

                bool negate = false;
                var  chars  = new HashSet <char>();

                if (patternIndex < patternLength && pattern[patternIndex] == '!')
                {
                    patternIndex++;
                    negate = true;
                }

                bool closed = false;

                while (patternIndex < patternLength)
                {
                    char ch = pattern[patternIndex];
                    switch (ch)
                    {
                    case ']':
                    {
                        patternIndex++;
                        closed = true;
                    }
                    break;

                    case '\\':
                    {
                        patternIndex++;

                        if (patternIndex < patternLength)
                        {
                            ch = pattern[patternIndex++];
                            if (!chars.Contains(ch))
                            {
                                chars.Add(ch);
                            }
                        }
                    }
                        continue;

                    default:
                    {
                        if (char.IsLetter(ch))
                        {
                            patternIndex++;

                            if (patternIndex + 1 < patternLength &&
                                pattern[patternIndex] == '-' &&
                                char.IsLetter(pattern[patternIndex + 1]))
                            {
                                patternIndex++;                                                 // -
                                char fromChar = ch;
                                char toChar   = pattern[patternIndex++];
                                for (char c = fromChar; c <= toChar; c++)
                                {
                                    if (!chars.Contains(c))
                                    {
                                        chars.Add(c);
                                    }
                                }
                            }
                            else
                            {
                                if (!chars.Contains(ch))
                                {
                                    chars.Add(ch);
                                }
                            }
                        }
                        else if (char.IsDigit(ch))
                        {
                            patternIndex++;

                            if (patternIndex + 1 < patternLength &&
                                pattern[patternIndex] == '-' &&
                                char.IsDigit(pattern[patternIndex + 1]))
                            {
                                patternIndex++;                                                 // -
                                char fromChar = ch;
                                char toChar   = pattern[patternIndex++];
                                for (char c = fromChar; c <= toChar; c++)
                                {
                                    if (!chars.Contains(c))
                                    {
                                        chars.Add(c);
                                    }
                                }
                            }
                            else
                            {
                                if (!chars.Contains(ch))
                                {
                                    chars.Add(ch);
                                }
                            }
                        }
                        else
                        {
                            patternIndex++;

                            if (!chars.Contains(ch))
                            {
                                chars.Add(ch);
                            }
                        }
                    }
                        continue;
                    }

                    break;
                }

                if (!closed || chars.Count == 0)
                {
                    return(null);
                }

                var element = new WildcardRangeElement();

                element.Negate = negate;
                element.Chars  = chars;
                element.Next   = WildcardElement.Create(pattern, ref patternIndex);

                return(element);
            }