2015-07-20 37 views
0

好的,所以我遇到了麻煩。我有一個有三個文本框和一個按鈕的表單,並且在第一個文本框(textBox1)中,用戶輸入一個句子。在下一個文本框(textBox3)中,用戶輸入一個單詞。然後用戶單擊一個按鈕,第三個文本框(textBox2)將檢查輸入的單詞是否與句子中的單詞匹配。我不能使用任何一種「快捷方式」,我只能走很長的路(沒有比較或類似的東西)。這是我到目前爲止有: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」當我輸入「hi it 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

問題:「問題」在你的代碼是始終檢查每個單詞。當發現匹配時,循環不停止。

解決方案:設置文本框後,您if語句添加一個return;(或break)語句爲「yes」

+0

這也適用!哇。所以我有一切工作,而我所需要的只是添加「休息」;將文本框設置爲「是」後。有一次,我甚至在「否」之後加入了休息時間,當它不起作用時,我就報廢了。 – PhilJ

+1

是的;)這也是一個好主意,有其他解決方案在腦海中,如其他答案中提到的那些(linq,正則表達式或其他循環) – 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

他特別說_I不能使用任何類型的「快捷方式」,我只能走很長的路。雖然regExp是解決此問題的好方法,但它可能被認爲是捷徑。 – user4067565

+0

Phyre是對的。雖然我很感謝Niclas的幫助,但regExp被認爲是一種捷徑。如果我可以使用它,我會在一段時間之前完成這項工作。不過,謝謝你的時間。我很感激。 – PhilJ

+0

最好使用單詞邊界而不是查找空格(例如,如果單詞以標點符號結尾,那麼該怎麼辦)。 http://www.regular-expressions.info/wordboundaries.html我認爲RegEx是正確的方法。如果OP受到其他約束,那麼他可能只是想讓別人去做他的功課,在這種情況下,他不配讓有人爲他做。 – Colin

0

你在做什麼,通過循環整個句子每次。您檢查包括最後一個單詞的每個單詞,並且textBox2.Text正在每個單詞上進行更改。你看到的是最後一個詞的結果。通過inWord循環,並把當前元素的值

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

foreach作品:

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循環,像這樣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.你真的需要自己做這項工作。