2015-07-20 2 views
0

Хорошо, так что у меня проблемы. У меня есть форма с тремя текстовыми полями и кнопкой, а в первом текстовом поле (textBox1) пользователь вводит предложение. В следующем текстовом поле (textBox3) пользователь вводит слово. Затем пользователь нажимает кнопку, а третий текстовый блок (textBox2) проверяет, соответствует ли введенное слово слову в предложении. Я не могу использовать какие-либо «ярлыки», я могу только проделать длинный путь (нет .Compare или что-то в этом роде). Вот то, что я до сих пор:C# Нужна помощь Поиск совпадающего слова во входном предложении

private void button1_Click(object sender, EventArgs e) 
    { 



     string inSentence = textBox1.Text.ToUpper(); 

     string txtB2 = textBox3.Text.ToUpper(); 

     string[] inWord; 

     inWord = inSentence.Split(' '); 

     int wordCount = inWord.Length; 

     for (int i = 0; i < wordCount; i++) 
     { 
      if (txtB2 == inWord[i]) 
      { 
       textBox2.Text = "Yes"; 
      } 
      else 
       textBox2.Text = "No"; 
     } 

    } 

Проблема у меня в том, что, скажем, если я типа «привет это я» в первом поле, единственное слово, которое будет соответствовать это «я». Он соответствует только последнему слову. Это не соответствует всему.

Опять же, я могу только сделать это примерно так. Я просто хотел бы знать, где я ошибаюсь, и почему. Если кто-то может мне помочь, это было бы очень признательно.

Я также попытался использовать этот

foreach (string n in inWord) 
     { 
      textBox2.Text = inWord + " "; 
      for (int i = 0; i < wordCount; i++) 
      { 

       if (txtB2 == n) 
       { 
        textBox2.Text = "Yes " + n; 
       } 
       else 
        textBox2.Text = "No " + n; 
      } 
     } 

И я получаю такую ​​же проблему (я добавил «N» на вывод текста, чтобы проверить, какое слово будет, и оно всегда на «ME» когда я набираю «привет его меня»).

ответ

0

Без использования регулярных выражений или IndexOf, и предположим, что вы должны использовать очень неэффективный метод итерации через каждое слово, выраженное ниже, вам нужно разбить выполнение цикла при нахождении соответствия. Для этого вам нужно использовать конструкцию while, а не цикл for.

bool found = false; 
int i = 0; 
while (!found && i < wordCount) 
{ 
    if (txtB2 == inWord[i]) 
    { 
     textBox2.Text = "Yes"; 
     found = true; 
    } 
    else 
     textBox2.Text = "No"; 

    i++; 
} 
+0

Почему бы не использовать тестирование вашего предложения против регулярного выражения, например: «[^ \ s] word [$ \ s]» – Niclas

+0

Это, вероятно, домашнее задание, если бы мне пришлось угадать. Не уверен, почему вы опубликовали этот комментарий против моего ответа, так как я добавил отказ от ответа на ваш конкретный вопрос. –

+0

Извините. Виноват. Комментировал первый пост. :) – Niclas

1

Проблема: «Проблема» в вашем коде, что всегда каждое слово проверяется. Когда совпадение было найдено, цикл не останавливается.

Решение: добавить return; (или break) заявление, в вашем if заявления после установки текстового поля «да»

+0

ЭТО РАБОТАЕТ! Вау. Поэтому у меня было все, что нужно, и все, что мне нужно, это добавить «перерыв»; после установки текстового поля на «Да». В какой-то момент я даже добавил перерыв после «Нет», и когда это не сработало, я его сломал. – PhilJ

+1

Да;) Также неплохо иметь альтернативные решения, например, упомянутые в других ответах (linq, regex или другой цикл). – rogi1609

0

Попробуй РегВыр

string text = "Your sentence"; 
string pat = "[^\s]word[$\s]"; //[rowstart or whitespace]word[rowend or whitespace] 
Regex r = new Regex(pat, RegexOptions.IgnoreCase); 
Match m = r.Match(text); 
if(m.Success) { 
    // The sentence contains the word 
} 
+0

Он специально сказал: «Я не могу использовать какие-либо« ярлыки », я может идти только по длинному пути. Хотя regExp - отличный способ решить проблему, это, вероятно, считается ярлыком. – user4067565

+0

Фире прав. Хотя я ценю помощь, Niclas, regExp считается ярлыком. Если бы я мог использовать его, я бы это сделал некоторое время назад. Спасибо за ваше время. Я ценю это. – PhilJ

+0

Лучше использовать границы слов вместо поиска пробелов (например, если слово заканчивается пунктуацией). http://www.regular-expressions.info/wordboundaries.html Я думаю, что RegEx - это правильный подход. Если OP в противном случае сдерживается, то он, вероятно, просто пытается заставить других заниматься своей работой, и в этом случае он не заслуживает того, чтобы кто-то сделал это за него. – Colin

0

Что вы делаете зацикливание через все предложение каждый раз. Вы проверяете каждое слово, включая последнее, и textBox2.Text изменяется на каждое слово. То, что вы видите, является результатом последнего слова.

textBox2.Text == "No"; // Initially set the text to "No" 
    for (int i = 0; i < wordCount; i++) 
    { 
     if (txtB2 == inWord[i]) 
     { 
      textBox2.Text = "Yes"; // If a matching word is found change text to yes 
      break; 
     } 
    } 

Если вы хотите использовать foreach, вы можете выйти из другой for петли внутри, как так:

textBox2.Text = "No"; 
foreach(string word in inWord) 
{ 
    if(txtB2 == word) 
     textBox2.Text = "Yes"; 
} 

The foreach произведение пробегает по inWord и положить значение текущего элемента word

0

Если единственным ограничением является то, что вы не используете регулярные выражения, то вы можете сделать что-то вроде этого

var wordArray = textBox1.Text.ToUpper().Split(" "); 
    var response = wordArray.Where(x=> x.Trim().Equals(textbox2Input.ToUpper()); 
//the base implementation of the equals method on strings is enough 

if(response.Any()) 
     textbox3.Text ="Yes"; 
    else 
    textbox3.Text="NO" 
0

Если Вы желаете практический способ идти о проблеме, то это:

var inSentence = textBox1.Text; 
var wordToFind = textBox3.Text; 

var wordFound = Regex.IsMatch(@"\b" + inSentence + @"\b", wordToFind, RegexOptions.IgnoreCase); 

Если это надуманный назначение школы, затем 1. Ваш учитель должен, вероятно, придумать лучшее упражнение и 2. вам действительно нужно делать работу самостоятельно.

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