private TDfaState BuildState() { try { if (_builder._frozenNodesDictionary.TryGetValue(_nodesCollection, out _frozenNodes) == false) { _frozenNodes = _nodesCollection.Freeze(); _builder._frozenNodesDictionary[_frozenNodes] = _frozenNodes; } if (_builder._frozenLazyTransitionsDictionary.TryGetValue(_lazyTransitionsCollection, out _frozenTransitions) == false) { _frozenTransitions = _lazyTransitionsCollection.Freeze(); _builder._frozenLazyTransitionsDictionary[_frozenTransitions] = _frozenTransitions; } _stateHashCode = 0; unchecked { _stateHashCode *= 397; _stateHashCode ^= _frozenNodes.ElementsHashCode; _stateHashCode *= 397; _stateHashCode ^= _frozenTransitions.ElementsHashCode; _stateHashCode *= 397; _stateHashCode ^= _successTransition?.GetHashCode() ?? 0; _stateHashCode *= 397; _stateHashCode ^= _prevSuccessTransition?.GetHashCode() ?? 0; } if (_builder._frozenStatesDictionary.TryGetValue(this, out var frozen)) { return(frozen); } frozen = _builder.CreateDfaState(_frozenNodes.Elements, _frozenTransitions.Elements, _successTransition, _prevSuccessTransition, _stateHashCode); var stateKey = new DfaFrozenStateKey(frozen); var stateValue = _nodesCollection.Count == 0 ? null : frozen; _builder._frozenStatesDictionary[stateKey] = stateValue; return(stateValue); } finally { Clear(); } }