Example #1
0
        private BaseFilterModel GetFilterWithTheNearestEnglishLevel(int neededCount, EnglishLevel userEnglishLevel)
        {
            var grammarParts  = new List <string>();
            var englishLevels = new List <EnglishLevel>();
            var totalCount    = 0;

            englishLevels.Add(userEnglishLevel);
            grammarParts.AddRange(TasksInformationModels[userEnglishLevel].GrammarPartCount.Keys);
            totalCount += TasksInformationModels[userEnglishLevel].GrammarPartCount.Values.Sum();

            var sortedEnglishLevelsByNearerToUser = EnglishLevelUtils.GetSortedEnglishLevelsByNearest(userEnglishLevel);

            foreach (var englishLevel in sortedEnglishLevelsByNearerToUser)
            {
                if (TasksInformationModels.TryGetValue(englishLevel, out var levelInformation))
                {
                    englishLevels.Add(englishLevel);
                    grammarParts.AddRange(TasksInformationModels[englishLevel].GrammarPartCount.Keys);
                    totalCount += TasksInformationModels[englishLevel].GrammarPartCount.Values.Sum();
                    if (totalCount >= neededCount)
                    {
                        break;
                    }
                }
            }

            var baseFilterModel = new BaseFilterModel();

            baseFilterModel.EnglishLevel = englishLevels;
            baseFilterModel.GrammarPart  = grammarParts;
            return(baseFilterModel);
        }
Example #2
0
        public BaseFilterModel GetFilterModelForUser(int neededCount, UserInformationModel userInformation)
        {
            var totalCountOfTasks = TasksInformationModels.Values.Sum(x => x.GrammarPartCount.Values.Sum());

            if (totalCountOfTasks < neededCount)
            {
                return(GetDefaultFilterModel());
            }

            if (!TasksInformationModels.TryGetValue(userInformation.EnglishLevel, out var userLevelInfo))
            {
                return(GetDefaultFilterModel());
            }

            var forUserLevelFilter = GetFilterForUserEnglishLevel(neededCount, userInformation, userLevelInfo);

            if (forUserLevelFilter != null)
            {
                return(forUserLevelFilter);
            }

            return(GetFilterWithTheNearestEnglishLevel(neededCount, userInformation.EnglishLevel));
        }