0

这个程序的背景很简单:我希望用户能够在 a 中输入任何字母(A、B、C 等)textbox,然后单击一个按钮,让程序返回多少个美国州开始用那个字母(例如输入字母A,结果是4)。

这是我现在的代码......

 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

4 回答 4

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))
于 2013-10-02T21:43:43.320 回答
3

Linq 可用于更雄辩的解决方案,即使用:

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

而不是你的“for”循环。

于 2013-10-02T21:55:04.947 回答
0

如果您所做的只是查找以每个字母开头的状态数,我不会使用这种解决方案,因为数据基本上是静态的。您可以使用 a 进行表查找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 开头的单词,你就会停下来。

于 2013-10-02T22:36:52.273 回答
0

使用 Lambda

result = Array.FindAll(States, x => x.StartsWith(myLetter)).Length;
于 2013-10-02T23:21:51.913 回答