В транслит на C#

В транслит на C#
Решал тут как-то микро-задачу по поиску логинов пользователей в домене, где почему-то не учитывается ФИО по-русски. Понадобилась транслитерация, в соответствии с определенными правилами. Странно, но сообразил далеко не сразу, видимо, старею :-(

Чтобы впредь не мучиться публикую функцию. Следует отметить, что обратное преобразовние из транслита в русский не возможно (ну или, по крайней мере очень сложно), поскольку буквы Мягкий знак и Твердый знак не транслителируются в используемых мною правилах транслитерации. Если по вашим правилам транслитерации эти знаки во что-то переводятся, тогда соответствие русского текста и транслита становится однозначным, соответственно, можно выполнить и обратное преобразование аналогичным же образом.

privatestaticstring Tr(string s)
{
string ret = "";
string[] rus = {"А","Б","В","Г","Д","Е","Ё","Ж", "З","И","Й","К","Л","М", "Н",
          "О","П","Р","С","Т","У","Ф","Х", "Ц", "Ч", "Ш", "Щ",   "Ъ", "Ы","Ь"
          "Э","Ю", "Я" };
string[] eng = {"A","B","V","G","D","E","E","ZH","Z","I","Y","K","L","M","N",
          "O","P","R","S","T","U","F","KH","TS","CH","SH","SHCH",null,"Y",null,
          "E","YU","YA"};

for (int j=0; j < s.Length; j++)
for (int i = 0; i < rus.Length; i++)
if (s.Substring(j, 1) == rus[i]) ret += eng[i];
 
    return ret;
}
 
Вариант, более быстрый на больших объемах (длинных строк транслитерации) и более щедящий к расходу памяти:
 
privatestaticstring Tr2(string s)
{
StringBuilder ret = new StringBuilder();
string[] rus = { "А", "Б", "В", "Г", "Д", "Е", "Ё", "Ж", "З", "И", "Й",
          "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х", "Ц",   
          "Ч", "Ш", "Щ", "Ъ", "Ы", "Ь", "Э", "Ю", "Я" };
string[] eng = { "A", "B", "V", "G", "D", "E", "E", "ZH", "Z", "I", "Y"
          "K", "L", "M", "N", "O", "P", "R", "S", "T", "U", "F", "KH", "TS",   
          "CH", "SH", "SHCH", null, "Y", null, "E", "YU", "YA" };

for (int j = 0; j < s.Length; j++)
for (int i = 0; i < rus.Length; i++)
if (s.Substring(j, 1) == rus[i]) ret.Append(eng[i]);
return ret.ToString();
}

Если есть у кого более прикольные варианты решения такой же задачи, пожалуйста, предлагайте.
Alt text
Обращаем внимание, что все материалы в этом блоге представляют личное мнение их авторов. Редакция SecurityLab.ru не несет ответственности за точность, полноту и достоверность опубликованных данных. Вся информация предоставлена «как есть» и может не соответствовать официальной позиции компании.
310K
долларов
до 18 лет
Антипов жжет
Ребёнок как убыточный
актив. Считаем честно.
Почему рожают меньше те, кто умеет считать на десять лет вперёд.

Сергей Солдатов

REPLY-TO-ALL is a double language blog (English/Russian) run by three information security practitioners. Want to discuss information security problems? This is the place.

FREE
100%
Кибербезопасность · Обучение
УЧИСЬ!
ИЛИ
ВЗЛОМАЮТ
Лучшие ИБ-мероприятия
и вебинары — в одном месте
ПОДПИШИСЬ
T.ME/SECWEBINARS