2015-09-21 2 views
0

Я пишу чат-помощник для игры с пользовательской библиотекой.Заменить конкретный текст из текста

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

Это мой код

static List<string> asciis = new List<string> { "shrug", "omg" }; 
static List<string> converteds = new List<string> { @"¯\_(ツ)_/¯", @"◕_◕"}; 

private static void Game_OnInput(GameInputEventArgs args) 
{ 
    newtext = args.Input; 
    foreach (var ascii in asciis) 
    { 
     foreach (var converted in converteds) 
     {    
      if (args.Input.Contains(ascii)) 
      { 
       newtext = args.Input.Replace(ascii, converted); 
       Game.Say(newtext); 
      } 
     } 
    } 
} 

Как вы можете видеть, что я пытаюсь получить тексты из «asciis» и превратить их в «converteds» (в порядке убывания).

Всякий раз, когда я печатаю то, что не входит в список «asciis», он отлично работает. Но всякий раз, когда я печатаю shrug печатает ¯\_(ツ)_/¯ + ◕_◕ + ◕_◕ (он печатает omg 2 раза). То же самое в omg тоже.

Возможно, вы понимаете, что я действительно начинаю. Я действительно не понял, что не так с этим кодом ...

+3

вы должны использовать словарь. –

+0

Не уверен, что словарь может помочь здесь. Ему нужно проверить каждое слово и (если найдено) заменить его.Поэтому вам нужно пройти весь набор ключей. Посмотрим, сможет ли кто-нибудь предоставить пример со словарем – Steve

+0

@Steve. Чем отличается от прохождения списка слов? Что мне не хватает? – async

ответ

1

Кажется, что ваши два списка имеют одинаковую длину (с точки зрения содержащихся элементов), и каждый элемент в одном списке имеет свою замену в том же положении в другой список.

Тогда вы могли бы рассматривать два списка в виде двух массивов и использовать другой способ поиска на срок ввода и заменить его с текстом замены

private static void Game_OnInput(GameInputEventArgs args) 
{ 
    newtext = args.Input; 
    for(int x = 0; x < ascii.Count; x++) 
     if (args.Input.Contains(ascii[x])) 
     { 
      newtext = args.Input.Replace(ascii[x], converted[x]); 
      Game.Say(newtext); 
     } 
} 

Хотя я не думаю, что это большой шаг вперед вы также можете реализовать то же самое со словарем

static Dictionary<string, string> converter = new Dictionary<string, string>() 
{ 
    {"shrug", @"¯\_(ツ)_/¯"}, 
    {"omg", @"◕_◕"} 
}; 

private static void Game_OnInput(GameInputEventArgs args) 
{ 
    newtext = args.Input; 
    foreach(KeyValuePair<string, string> kvp in converter) 
     if (args.Input.Contains(kvp.Key)) 
     { 
      newtext = args.Input.Replace(kvp.Key, kvp.Value); 
      Game.Say(newtext); 
     } 
} 

Ну, возможно, немного более удобными для чтения, но все же мы должны обход словаря ключей один за другим.

+1

Это определенно работает, однако я бы порекомендовал 'Dictionary ' над 2 отдельными массивами. –

+0

Но вам нужно пройти полный словарь Ключи для замены, чтобы в чем преимущество словаря? – Steve

+1

У вас есть единственный объект, который содержит отображение значения ключа, например. 'Smiley-> =)', а не на основе индекса на основе массива, который имеет огромную возможность смещения. –

0

Как отметил Даниил в своем комментарии, это хороший прецедент для словарей.

есть словарь, который отображает текст, который вы хотите заменить на материал, который Вы хотите заменить:

Dictionary<string, string> dict = new Dictionary<string, string> 
{ 
    {"shrug", @"¯\_(ツ)_/¯" }, 
    {"omg", "◕_◕" } 
}; // etc 

Затем найти все вхождения ключей из словаря и заменить их соответствующими значениями.

Также почему вы используете static методы и поля? Возможно, я ошибаюсь, но я ожидаю больше всего, если не все ваши другие методы и поля - static. Я настоятельно рекомендую избегать привыкания к ним. Попробуйте узнать больше об ООП.

0

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

Я также предлагаю словарь, поскольку по определению это сопоставление одной вещи с другой. Кроме того, обратите внимание, мои изменения ниже, я переместил вызов Game.Say вне петли и изменился «args.Input.Replace» на «newtext.Replace»

Dictionary<string, string> dictionary = new Dictionary<string, string> 
{ 
    {"shrug", @"¯\_(ツ)_/¯" }, 
    {"omg", "◕_◕" } 
}; 

private static void Game_OnInput(GameInputEventArgs args) 
{ 
    string newtext = args.Input; 
    foreach(string key in dictionary.Keys){ 
     newtext = newtext.Replace(key,dictionary[key]); 
    } 

    Game.Say(newtext); 
} 
+0

Изменение 'args.Input.Replace' на' newtext.Replace' изменяет поведение кода. Подумайте, включил ли 'словарь'' {"◕_◕", "omg"} '. –

+0

Я не следую. Цель этого кода - заменить все экземпляры словаря Key на соответствующее значение, так почему же было бы обратное отображение «◕_◕» на «omg»? Рассмотрим случай, когда у вас есть строка «omg!», Которая была настолько странной? Shrug ». Если вы сохранили args.Input.Replace, то первая итерация установит newtext в «omg!», Что было так странно? ¯ \ _ (ツ) _/¯ », а затем вторая итерация перепишет его как« ◕_◕! », Который был так странно? shrug ", таким образом, только переписывая один Ключ с его соответствующим значением. – spectacularbob

+0

Исходный код заменяет все экземпляры словарного ключа в 'args.Input' с соответствующим значением. Ваш код заменяет все экземпляры словарного ключа в 'args.Input' ** и в последующих словарных значениях ** со связанным значением. Они будут отличаться, если значение словаря содержит ключ словаря. Да, в примере нет значений словаря, содержащих ключ словаря, но это опасная вещь, на которую можно положиться. –

Смежные вопросы