private static IEnumerable <PlantAdviseModel> RecommendPlantsWithUserSimilarityIndexes(
            IEnumerable <PlantModel> availablePlantList, int userId)
        {
            var userPlantRatingList     = ReadUserPlantRatingCsv();
            var userSimilarityIndexList = CalculateUserSimilarityIndex(userId, userPlantRatingList);

            var plantAdviseList = new List <PlantAdviseModel>();

            foreach (var plant in availablePlantList) // Voor elke plant een rating bepalen
            {
                var likeIndexes    = CountLikeIndexesForPlant(userPlantRatingList, userSimilarityIndexList, plant);
                var dislikeIndexes = CountDislikeIndexesForPlant(userPlantRatingList, userSimilarityIndexList, plant);
                var ratesCount     = CountTimesPlantIsRated(userPlantRatingList, plant);
                var plantIndex     = (likeIndexes - dislikeIndexes) / ratesCount;

                var newPlantAdvise = new PlantAdviseModel
                {
                    Plant  = plant,
                    Rating = plantIndex
                };

                plantAdviseList.Add(newPlantAdvise);
            }

            plantAdviseList = plantAdviseList.OrderByDescending(p => p.Rating).ToList();
            return(plantAdviseList);
        }
        private static IEnumerable <PlantAdviseModel> RecommendPlantsBasedOnGardenLocation(
            IReadOnlyCollection <PlantModel> plantList, LocationModel gardenLocation)
        {
            var cityName      = gardenLocation.CityName;
            var cityPlantList = ReadCityPlantDataCsv();

            cityPlantList = cityPlantList.Where(c => c.CityName.ToLower().Equals(cityName.ToLower()));

            var orderedPlantList = new List <PlantAdviseModel>();

            // This loop adds plants that aren't being grown in city.
            foreach (var plant in plantList)
            {
                var isPlantInCity = cityPlantList.Any(cityPlantModel =>
                                                      cityPlantModel.PlantName.ToLower().Equals(plant.Name.ToLower()));
                if (isPlantInCity)
                {
                    continue;
                }

                var plantAdvise = new PlantAdviseModel
                {
                    Rating   = 0,
                    CityName = cityName,
                    Plant    = plant
                };

                orderedPlantList.Add(plantAdvise);
            }

            // This loops adds plants that are being grown in the city (in order from least to most).
            foreach (var cityPlantModel in cityPlantList)
            {
                foreach (var plant in plantList)
                {
                    if (!plant.Name.Equals(cityPlantModel.PlantName))
                    {
                        continue;
                    }

                    var adviceRating = DetermineCityPlantAdviceRating(cityPlantModel);

                    var plantAdvise = new PlantAdviseModel
                    {
                        Rating   = adviceRating,
                        CityName = cityName,
                        Plant    = plant
                    };

                    orderedPlantList.Add(plantAdvise);
                    break;
                }
            }

            return(orderedPlantList.OrderByDescending(p => p.Rating));
        }