private void findSP(List<int> allResultIds, PartOfSpeech PartOfSpeech, ObjectType type) { // из всех текущих id выбираем такие, которые являются заданным типом СЧР List<int> idsToAnalyze = new List<int>(); foreach (var resultId in allResultIds) { if (_sentence.WordList.Exists(x => x.Id == resultId && x.PartOfSpeech.Value == PartOfSpeech.Value)) idsToAnalyze.Add(resultId); } foreach (var wordId in idsToAnalyze) { //ищем дочернее слово для СЧР List<SentenceWord> childWords = _sentence.WordList.FindAll(x => x.DOM == wordId); foreach (var childWord in childWords) { // найдем в текущих результатах такой элемент, id которого либо равен исследуемому, либо в его ServiceParts присутствует исследуемый id - чтобы знать куда добавлять инфу var resultItem = Result.Items.Find(x => x.Id == wordId); if (resultItem == null) { foreach (var i in Result.Items) { if (i.ServiceParts.Exists(x => x.Id == wordId)) resultItem = i; } } Debug.Assert(resultItem != null); // если дочернего слова нет в списке предварительных элеметнов, то добавляем его вместо текущего элемента, присоединяя к нему СЧР с заданным типом СЧР if (!allResultIds.Exists(x => x == childWord.Id)) { Stage2ResultElement itemToAdd = new Stage2ResultElement(); itemToAdd.IsRestoredFromServicePart = true; itemToAdd.CopyFromSourceWord(childWord); itemToAdd.ObjectType = type; if (itemToAdd.ServiceParts.Find(x => x.Id == wordId) == null) itemToAdd.ServiceParts.Add(_sentence.WordList.Find(x => x.Id == wordId)); Result.Items.Remove(resultItem); Result.Items.Add(itemToAdd); } // а если такое слово есть, то берем его и объединяем с СЧР, с заданным типом else { var existResult = Result.Items.Find(x => x.Id == childWord.Id); if (resultItem.ServiceParts.Find(x => x.Id == wordId) == null && resultItem.Id != wordId) resultItem.ServiceParts.Add(_sentence.WordList.Find(x => x.Id == wordId)); Result.Items.RemoveAll(x => x.Id == wordId); } allResultIds = getAllMainPartsIds(type); } } }
public override void ProcessSentence(Sentence sentence) { _sentence = sentence; Debug.Assert(_stage1Result != null); // Подлежащие foreach (var sourceWord in _stage1Result.Items.FindAll(x => x.ObjectType == ObjectType.Subject)) { Stage2ResultElement item = new Stage2ResultElement(); item.CopyFromSourceWord(sourceWord); Result.Items.Add(item); } // Сказуемые foreach (var sourceWord in _stage1Result.Items.FindAll(x => x.ObjectType == ObjectType.Predicate)) { Stage2ResultElement item = new Stage2ResultElement(); item.CopyFromSourceWord(sourceWord); Result.Items.Add(item); } }