Lucene.Net.Analysis.Synonym.SlowSynonymMap.MergeTokens C# (CSharp) Метод

MergeTokens() публичный статический Метод

Merge two lists of tokens, producing a single list with manipulated positionIncrements so that the tokens end up at the same position. Example: [a b] merged with [c d] produces [a/b c/d] ('/' denotes tokens in the same position) Example: [a,5 b,2] merged with [c d,4 e,4] produces [c a,5/d b,2 e,2] (a,n means a has posInc=n)
public static MergeTokens ( IList lst1, IList lst2 ) : IList
lst1 IList
lst2 IList
Результат IList
        public static IList<Token> MergeTokens(IList<Token> lst1, IList<Token> lst2)
        {
            var result = new List<Token>();
            if (lst1 == null || lst2 == null)
            {
                if (lst2 != null)
                {
                    result.AddRange(lst2);
                }
                if (lst1 != null)
                {
                    result.AddRange(lst1);
                }
                return result;
            }

            int pos = 0;
            var iter1 = lst1.GetEnumerator();
            var iter2 = lst2.GetEnumerator();
            var tok1 = iter1.MoveNext() ? iter1.Current : null;
            var tok2 = iter2.MoveNext() ? iter2.Current : null;
            int pos1 = tok1 != null ? tok1.PositionIncrement : 0;
            int pos2 = tok2 != null ? tok2.PositionIncrement : 0;
            while (tok1 != null || tok2 != null)
            {
                while (tok1 != null && (pos1 <= pos2 || tok2 == null))
                {
                    var tok = new Token(tok1.StartOffset(), tok1.EndOffset(), tok1.Type);
                    tok.CopyBuffer(tok1.Buffer(), 0, tok1.Length);
                    tok.PositionIncrement = pos1 - pos;
                    result.Add(tok);
                    pos = pos1;
                    tok1 = iter1.MoveNext() ? iter1.Current : null;
                    pos1 += tok1 != null ? tok1.PositionIncrement : 0;
                }
                while (tok2 != null && (pos2 <= pos1 || tok1 == null))
                {
                    var tok = new Token(tok2.StartOffset(), tok2.EndOffset(), tok2.Type);
                    tok.CopyBuffer(tok2.Buffer(), 0, tok2.Length);
                    tok.PositionIncrement = pos2 - pos;
                    result.Add(tok);
                    pos = pos2;
                    tok2 = iter2.MoveNext() ? iter2.Current : null;
                    pos2 += tok2 != null ? tok2.PositionIncrement : 0;
                }
            }
            return result;
        }
    }