private bool calculateStrainValues() { // Traverse hitObjects in pairs to calculate the strain value of NextHitObject from the strain value of CurrentHitObject and environment. using (List <TaikoHitObjectDifficulty> .Enumerator hitObjectsEnumerator = difficultyHitObjects.GetEnumerator()) { if (!hitObjectsEnumerator.MoveNext()) { return(false); } TaikoHitObjectDifficulty current = hitObjectsEnumerator.Current; // First hitObject starts at strain 1. 1 is the default for strain values, so we don't need to set it here. See DifficultyHitObject. while (hitObjectsEnumerator.MoveNext()) { var next = hitObjectsEnumerator.Current; next?.CalculateStrains(current, TimeRate); current = next; } return(true); } }