private void Crack(Combination combination, string guess, Solution solution, List <string> possibilities) { GuessResult baseResult = combination.Try(guess); solution.Guesses.Add(guess); if (baseResult.WasRight) { solution.Answer = guess; return; } // I'm going to modify the collection, with that in mind we won't use // a foreach loop. for (int i = 0; i < possibilities.Count; i++) { GuessResult result = combination.Try(guess, possibilities[i]); if (!result.Equals(baseResult)) { possibilities.Remove(possibilities[i]); i--; } } }