2013-10-02 49 views
0

該程序的背景足夠簡單:我希望用戶能夠將任何字母(A,B,C等)輸入到textbox ,然後點擊一個按鈕,讓程序返回美國有多少州以該字母開頭(例如輸入字母A,結果爲4)。使用for-loop從數組中拉出/添加特定值

這裏是我的代碼截至目前...

private void btnClick_Click(object sender, EventArgs e) 
     { 
    string[] States = new String[50] {"Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", 
     "Connecticut", "Delaware", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", 
     "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri", 
     "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York", "North Carolina", 
     "North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", 
     "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming"}; 

     string myLetter = txtboxEnter.Text; 
     int result; 
     result = 0; 

     for (int i = 0; i <= States.Length - 1; i++) 
     { 
      if (States[i].Substring(0, 1) == myLetter) 
      { 
       result = result + i; 
      } 
      else 
      { 
       result = 0; 
      } 
     } 
     lblDisplay.Text = Convert.ToString(result); 
    } 

正如你看到的,我有美國在數組聲明。

我遇到的問題是for循環和If聲明裏面。

總是返回的值是0。我覺得好像我需要另一行代碼直接循環到總值。我對麼?

回答

4

更改此:

if (States[i].Substring(0, 1) == myLetter) 
{ 
    result = result + i; 
} 
else 
{ 
    result = 0; 
} 

要這樣:

if (States[i].Substring(0, 1) == myLetter) 
{ 
    ++result; 
} 

如果你想的東西多一點效率,改變與此相比:

if (States[i].StartsWith(myLetter)) 
+0

是,你可能還希望確保它不區分大小寫。你可以重載StartsWith來處理你喜歡的情況。 –

3

的Linq可以用於更有說服力的解決方案,即使用:

States.Count(state => state.StartsWith(myLetter)); 

而不是你的「for」循環。

+1

+1,這也是我所要做的。不想將邏輯誤差校正與完整的算法替換混淆。 –

+0

不錯。添加事件處理器和修剪TextBox ... States.Count(state => state.Substring(0,1).ToUpper()== myLetter.Trim()。ToUpper()); –

+0

@CoryNelson我同意你回答了這個問題,但是當我看到這樣的問題時,我總是覺得Linq提供了更清晰的代碼,而不是這個勞動循環! –

0

如果你正在做的是找到每個字母開頭的狀態數,我不會使用這種解決方案,因爲數據基本上是靜態的。您可以使用Dictionary<char, int>來進行表查找,並使用單個字符而不是字符串,並將其變爲類變量,因此您不必每次都創建它。例如:

//-snip- 
private Dictionary<char, int> States; 

//-snip- 
public Form1() 
{ 
    States = new Dictionary<char, int>(); 
    States.add('A', 4); 
    States.add('B', 0); 
    States.add('C', 3); 
    States.add('D', 1); 
    //... etc. 
} 
//-snip- 

private void btnClick_Click(object sender, EventArgs e) 
{ 
    char myLetter = txtboxEnter.Text.Trim()[0]; // do some other input sanitation here 
    int result = States[myLetter]; 
    lblDisplay.Text = Convert.ToString(result); // consider making your Dictionary <char, string> so you can skip the conversion here 
} 

如果你仍然堅持自己的解決方案,你也可以通過利用一個事實,即你的數組排序優勢添加一些性能調整到它。你可以做二進制搜索,但這有點矯枉過正,但是至少當你找到符合條件的狀態並且不再符合條件的狀態時,至少你可以擺脫循環(例如,如果你正在尋找所有的在英文字典中以B開頭的單詞,一旦你點擊以C開頭的單詞,就會停止。

0

使用lambda

result = Array.FindAll(States, x => x.StartsWith(myLetter)).Length;