Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование в широком смысле слова > Алгоритмика

Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения

Ответ
 
Опции темы
Старый 01.07.2015, 12:39   #1
Andvrok
Бывалый
 
Регистрация: 26.07.2009
Сообщений: 785
Написано 362 полезных сообщений
(для 995 пользователей)
Падежирование и костылирование

Как вы решаете вопросы падежей? Допустим, у меня есть файлик ресурсов (C#), в котором лежат соответствия значениям энумов:

ENUM_EnDamageType_Physical => Физический урон 
и метод расширения, который эти значения получает:

public static string GetValue(this Enum en)
        {
            
string resourceDisplayName _lov.GetString("ENUM_" en.GetType().Name "_" en);

            return 
string.IsNullOrWhiteSpace(resourceDisplayName) ? string.Format("[[{0}]]"en) : resourceDisplayName;
        } 
Задача: получать нужный падеж при необходимости.

Вопрос: как лучше всего хранить/получать эти значения?

Оговорюсь сразу, про готовые лингвистические библиотеки я в курсе, но они для моей задачи избыточны и несовершенны в своём большинстве, да и вообще, хотелось бы самому повелосипедировать.

На данный момент у меня такое решение: в ресурсах хранится не только номинатив, но и генитив с дативом (остальные не востребованны), разделяемые спец.символом. Например:

ENUM_EnDamageType_Physical => Физический урон|Физического урона|Физическому урону 
В то же время метод допилен до состояния

public static string GetValue(this Enum enEnGrammaticalCase gc EnGrammaticalCase.Nominative)
        {
            
string[] values _lov.GetString("ENUM_" en.GetType().Name "_" en).Split('|');
            switch (
gc)
            {
                case 
EnGrammaticalCase.Genitive:
                    {
                        return 
string.IsNullOrWhiteSpace(values[1]) ? string.Format("[[{0}]]"en) : values[1];
                    }
                case 
EnGrammaticalCase.Dative:
                    {
                        return 
string.IsNullOrWhiteSpace(values[2]) ? string.Format("[[{0}]]"en) : values[2];
                    }
                default:
                    {
                        return 
string.IsNullOrWhiteSpace(values[0]) ? string.Format("[[{0}]]"en) : values[0];
                    }
            }
        } 
Буду рад выслушать более простые/изящные/правильные решения.
(Offline)
 
Ответить с цитированием
Старый 02.07.2015, 00:48   #2
Igor
Мастер
 
Аватар для Igor
 
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений
(для 790 пользователей)
Ответ: Падежирование и костылирование

Наверно, форматировать строку при каждом вызове метода не очень хорошо, лучше во время инициализации один раз сделать. (хотя, может, ты один только один раз метод для каждого значения вызываешь и смысла нет).
Я бы элементам перечисления EnGrammaticalCase присвоил чиселки 0,1,2, чтобы не писать длинный switch-case



__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Andvrok (02.07.2015)
Старый 02.07.2015, 03:24   #3
Andvrok
Бывалый
 
Регистрация: 26.07.2009
Сообщений: 785
Написано 362 полезных сообщений
(для 995 пользователей)
Ответ: Падежирование и костылирование

Для каждого значения метод вызывается один раз в конструкторе класса и всё; думаю, всё равно стоит сделать только один ретурн, как минимум для удобства.

Длинные значения энумов меня не напрягают, всё равно студия автоподстановкой щедро сыпет.
(Offline)
 
Ответить с цитированием
Старый 02.07.2015, 09:25   #4
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Падежирование и костылирование

Сообщение от Andvrok Посмотреть сообщение
Длинные значения энумов меня не напрягают, всё равно студия автоподстановкой щедро сыпет.
Igor имел в виду задать соответствие значений энама индексам в массиве:

public static string GetValue(this Enum enEnGrammaticalCase gc EnGrammaticalCase.Nominative

      
string[] values _lov.GetString("ENUM_" en.GetType().Name "_" en).Split('|'); 
      var 
= (int)gc;
      return 
string.IsNullOrWhiteSpace(values[i]) ? string.Format("[[{0}]]"en) : values[i]; 

__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Andvrok (02.07.2015)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 21:15.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com