private static void RecurGetStatesInternal <T>(IRegexFSMState <T> startState, HashSet <IRegexFSMState <T> > states)
 {
     if (states.Add(startState))
     {
         foreach (var transition in startState.Transitions.Where(transition => transition.Target != null))
         {
             RegexFSMUtility.RecurGetStatesInternal(transition.Target, states);
         }
     }
 }
        /// <summary>
        /// 递归获取指定起始状态开始能达到的所有状态的集合。
        /// </summary>
        /// <param name="startState">指定的起始状态。</param>
        /// <returns>指定起始状态开始能达到的所有状态的集合。</returns>
        /// <exception cref="ArgumentNullException"><paramref name="startState"/> 的值为 null 。</exception>
        public static IEnumerable <IRegexFSMState <T> > RecurGetStates <T>(this IRegexFSMState <T> startState)
        {
            if (startState == null)
            {
                throw new ArgumentNullException(nameof(startState));
            }

            HashSet <IRegexFSMState <T> > states = new HashSet <IRegexFSMState <T> >();

            RegexFSMUtility.RecurGetStatesInternal(startState, states);

            return(states);
        }