/// <summary> /// Backward Match /// </summary> /// <param name="s">address string[]</param> /// <returns>result</returns> public MatchResult Match(String[] s) { MatchHelper.Assert(s.Count() == 0, @" input string[]'s length is 0 "); Stack <State> MatchStack = new Stack <State>(); MatchResult result = new MatchResult(); s.Reverse(); //Store the first Match State firstState = new State(); ReaderWriterLockSlim rwlock = _addrset.GetRWlock(); rwlock.EnterReadLock(); for (int i = 0; i < s.Count(); i++) { State correntState = _addrset.FindNodeInHashTable(s[i]); if (i == 0) { firstState = correntState; } if (correntState.NodeCount == 0) { result.ResultState = MatchResultState.NOTFOUND; goto RESULT; } //MatchStack. if (MatchStack.Count > 0) { FilterState(correntState, MatchStack.Peek()); if (correntState.NodeCount == 0) { result.ResultState = MatchResultState.NOTMATCHED; goto RESULT; } } MatchStack.Push(correntState); } if (MatchStack.Count == 0) { result.ResultState = MatchResultState.NOTFOUND; goto RESULT; } if (MatchStack.Peek().NodeCount > 1) { result.ResultState = MatchResultState.MULTIMATCHED; goto RESULT; } List <GraphNode> resList; State TopState = MatchStack.Pop(); do { State nextState = MatchStack.Pop(); resList = _addrset.ForwardSearchNode(delegate(GraphNode node) { return(node.Name == nextState.Name); }, TopState.NodeList); //if (resList.Count > 1) //{ // result.ResultState = MatchResultState.MULTIMATCHED; // return result; //} } while (MatchStack.Count > 0); rwlock.ExitReadLock(); if (resList == null || resList.Count == 0) { result.ResultState = MatchResultState.NOTMATCHED; goto RESULT; } if (resList.Count > 1) { result.ResultState = MatchResultState.MULTIMATCHED; goto RESULT; } result.Result = resList.First(); result.ResultState = MatchResultState.SUCCESS; RESULT: rwlock.ExitReadLock(); return(result); }