2013-10-02 2 views
0

Фон этой программы достаточно прост: я хочу, чтобы пользователь мог ввести любую букву (A, B, C и т. Д.) В textbox , и одним нажатием кнопки вернуть программу, сколько штатов США начнется с этой буквы (например, введенная буква A и результат 4).Вытягивание/добавление определенных значений из массива с использованием цикла for

Вот мой код, как сейчас ...

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)); 

вместо вашего цикла «для».

+1

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

+0

Ницца. Добавление обработчика case и обрезка 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; 
Смежные вопросы