private IOrderedEnumerable<SentenceElement> _simpleSentenceWords(Stage3ResultElement algResult)
 {
     return algResult.ChainWordsIds.All.Values.Select(wordId => _sentence.ElementList.Find(word => word.Id == wordId)).
         Concat(_sentence.ElementList.FindAll(word => word.Order == algResult.Order)).
         OrderBy(word => word.Order);
 }
        public override void ProcessSentence(Sentence sentence)
        {
            _sentence = sentence;
            Debug.Assert(sentence.ElementList != null);
            Debug.Assert(sentence.ElementList.Count > 0);
            List<SentenceElement> words = sentence.ElementList;

            // берем результат 2-го этапа и для каждого элемента восстанавливаем цепочку синтаксической связи
            foreach (var sentenceWordStage2 in _simpleSentenceStage2Result)
            {
                Stage3ResultElement item = new Stage3ResultElement();
                item.CopyFromSourceWord(sentenceWordStage2);
                var excludeIds = new List<string>();
                // формируем массив иключений при поиске зависимой цепочки
                foreach (var res in _simpleSentenceStage2Result)
                    excludeIds.Add(res.Id);

                item.LoadChainList(excludeIds.ToArray(), ref words);
                item.IsCorrect = sentenceWordStage2.IsCorrect;

                Result.Items.Add(item);
            }

            foreach (var item in Result.Items.FindAll(x => x.IsCorrect == false))
            {
                // Имеем дело с ОЧ-сказуемым. Находим в существующих результатах item , который является родителем по ОЧ и добавляем к нему
                var foundParentItem = Result.Items.Find(x => x.ConjuctedWithId == item.Id);
                if (foundParentItem != null)
                    foundParentItem.ChainWordsIds.InsertChild(item.ChildWordsIds.Root.Tree);
            }

            // формируем номера ПП

            SortedList<int, int> minWordOrder = new SortedList<int, int>();
            // номера ПП определяются по минимальному порядковому номеру слов в выбранном предложении
            foreach (var item in Result.Items.FindAll(x => x.IsCorrect == true))
            {
                List<int> sentenceWordOrders = item.ChainWordsIds.All.Values.Select(x => int.Parse(x)).ToList();
                sentenceWordOrders.Add(int.Parse(item.Id));
                foreach (var chainWordId in item.ChainWordsIds.Values)
                    sentenceWordOrders.Add(sentence.ElementList.Find(x => x.Id == chainWordId).Order);
                sentenceWordOrders.Sort();

                minWordOrder.Add(int.Parse(item.Id), sentenceWordOrders[0]);
            }

            int lastNr = 1;
            foreach (var dictItem in minWordOrder)
            {
                Result.Items.Find(x => int.Parse(x.Id) == dictItem.Key).SimpleSentenceNr = lastNr;
                lastNr++;
            }
        }