private IEnumerable <string> GetUndesirabilityReasons <TBaseGrowthZoneClusterConsumption>( TBaseGrowthZoneClusterConsumption baseGrowthZoneClusterConsumption, Func <ICityBudgetConfiguration, decimal> getCityBudgetValue) where TBaseGrowthZoneClusterConsumption : BaseGrowthZoneClusterConsumption { if (baseGrowthZoneClusterConsumption.PopulationDensity < 9) { return(Enumerable.Empty <string>()); } if (!_taxRateMultiplier.HasValue) { _taxRateMultiplier = 1M / TaxDefinition.GetSelectableTaxRatePercentages().Max(); } return(baseGrowthZoneClusterConsumption .ZoneClusterMembers .Single(x => x.IsCentralClusterMember) .GetZoneInfo() .WithResultIfHasMatch(centralZone => { var issueThreshold = 1.5M - (getCityBudgetValue(_cityBudgetConfiguration) * _taxRateMultiplier); return GetIssueResults(centralZone, x => x.RepresentsUndesirabilityFor(baseGrowthZoneClusterConsumption)) .Where(x => x.IssueAmount > issueThreshold) .Select(x => x.Issue); })); }