예제 #1
0
        /// <summary>
        /// Поиск существительного по неточному совпадению с автоматическим определением рода, падежа и числа.
        /// Возвращает null если слово не было найдено.
        /// </summary>
        /// <param name="word">Существительное в любом роде, числе и падеже.</param>
        /// <param name="foundWord">Существительное, найденное в словаре.</param>
        /// <param name="number">Число найденного существительного.</param>
        /// <param name="case">Падеж найденного существительного.</param>
        /// <returns></returns>
        public CyrNoun GetOrDefault(string word, out string foundWord, out CasesEnum @case, out NumbersEnum number)
        {
            CyrNoun noun = this.GetOrDefault(word, out @case, out number);

            if (noun != null)
            {
                foundWord = word;
                return(new CyrNoun(noun));
            }

            foundWord = this.GetSimilar(word, this.NounMinSameLetters, this.NounMaxSameLetters);

            if (string.IsNullOrEmpty(foundWord))
            {
                return(null);
            }

            noun = this.GetOrDefault(foundWord, out @case, out number);

            if (noun != null)
            {
                noun = new CyrNoun(noun);
                noun.SetName(word, @case, number);
                return(noun);
            }

            return(null);
        }
예제 #2
0
        /// <summary>
        /// Поиск существительного по неточному совпадению с указанием рода, падежа и числа.
        /// Возвращает null если слово не было найдено.
        /// </summary>
        /// <param name="word">Существительное.</param>
        /// <param name="foundWord">Существительное, найденное в словаре.</param>
        /// <param name="gender">Род, в котором указано существительного.</param>
        /// <param name="case">Падеж, в котором указано существительного.</param>
        /// <param name="number">Число, в котором указано существительного.</param>
        /// <returns></returns>
        public CyrNoun GetOrDefault(string word, out string foundWord, GendersEnum gender, CasesEnum @case, NumbersEnum number)
        {
            CyrNoun noun = this.GetOrDefault(word, gender, @case, number);

            if (noun != null)
            {
                foundWord = word;
                return(new CyrNoun(noun));
            }

            DictionaryKey key = default;

            foundWord = null;

            if (this.EnableCache)
            {
                key = new DictionaryKey(word, gender, @case, number);

                if (this.similarSearchByKeyCache.TryGetValue(key, out foundWord))
                {
                    noun = this.GetOrDefault(foundWord, gender, @case, number);
                    noun = new CyrNoun(noun);
                    noun.SetName(word, @case, number);

                    return(noun);
                }
            }

            foreach (string candidate in this.cyrData.GetSimilars(word, this.wordCandidates, this.NounMinSameLetters, this.NounMaxSameLetters))
            {
                noun = this.GetOrDefault(candidate, gender, @case, number);

                if (noun == null)
                {
                    continue;
                }

                noun = new CyrNoun(noun);
                noun.SetName(word, @case, number);
                foundWord = candidate;

                break;
            }

            if (this.EnableCache)
            {
                this.similarSearchByKeyCache.Add(key, foundWord);
            }

            return(noun);
        }