private void FinishResolvingIfNoMorePairsCanBeDeleted() { if (Deletions.Any() && AdditionsAndInsertions.Count > Deletions.Count) { return; } if (AdditionsAndInsertions.Count <= 1) { if (Deletions.Count > 1) { // This should probably be an exception, but maybe we can recover... Deletions.RemoveRange(1, Deletions.Count - 1); Debug.Fail($"There were more deletions than additions for {Deletions.Single().Key}."); } } else if (Deletions.Count <= 1) { // REVIEW: We're assuming that the first (remaining) addition is the "base" one (i.e., any other non-duplicates will // be hanging off of it as an insertion or addition). If this is not true, we'll need to look through the list to find // the first one whose OriginalPhrase is not the ModifiedPhrase of any other addition/insertion in the list. var baseAddition = AdditionsAndInsertions[0].ModifiedPhrase; var i = 0; while (i + 1 < AdditionsAndInsertions.Count) { // We assume that earlier ones in the list are older versions whose answers are less likely to be the most desirable // one, so we delete ealier ones first so that the last one survives (and its answer will be inserted first in the // list. Sadly, this is probably the best we can do. var iNewBase = AdditionsAndInsertions.FindIndex(i + 1, a => a.ModifiedPhrase == baseAddition); if (iNewBase < 0) { break; } RemoveAddition(i); i = iNewBase; } } else { return; } if (AllAnswers.Any()) { var bestAnswer = AdditionsAndInsertions.First().Answer; if (!String.IsNullOrWhiteSpace(bestAnswer) && !AllAnswers.Any(a => a.Contains(bestAnswer))) { AllAnswers.Insert(0, bestAnswer); } else if (AllAnswers.Count == 1) { AdditionsAndInsertions.First().Answer = AllAnswers[0]; AllAnswers = null; } } m_isResolved = true; }