使用 for 循环从数组中提取/添加特定值

本文关键字:添加 提取 for 循环 数组 使用 | 更新日期: 2023-09-27 18:33:44

这个程序的背景很简单:我希望用户能够在textbox中输入任何字母(A,B,C等),然后单击一个按钮,让程序返回有多少个美国州以该字母开头(例如输入字母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 。我觉得我好像需要另一行代码直接用于总值的循环。我说的对吗?

使用 for 循环从数组中提取/添加特定值

更改以下内容:

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

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

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

而不是你的"for"循环。

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

使用 Lambda

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