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);
            }));
        }