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

C# 使用for循环从数组中提取/添加特定值,c#,arrays,if-statement,for-loop,C#,Arrays,If Statement,For Loop,该程序的背景非常简单:我希望用户能够在文本框中输入任意字母a、B、C等,然后单击按钮,让程序返回有多少美国州以该字母开头,例如输入字母a,结果为4 这是我现在的代码 private void btnClick_Click(object sender, EventArgs e) { string[] States = new String[50] {"Alabama", "Alaska", "Arizona", "Arkansas", "California", "Col

该程序的背景非常简单:我希望用户能够在文本框中输入任意字母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。我觉得好像我需要另一行代码直接循环到总值。我说的对吗?

更改此选项:

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循环不同。

如果您所做的只是查找以每个字母开头的状态数,我不会使用这种解决方案,因为数据基本上是静态的。您可以使用字典进行表查找,使用单个字符而不是字符串,并将其作为类变量,这样您就不必每次都创建它。例如:

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

是的,您可能还需要确保它不区分大小写。你可以用重载StartsWith来处理你喜欢的情况。不希望将逻辑错误更正与完整算法替换合并在一起。Nice。正在添加案例处理程序和修剪文本框。。。States.Countstate=>state.Substring0,1.ToUpper==myLetter.Trim.ToUpper@CoryNelson我同意你回答了这个问题,但是当我看到这样的问题时,我总是觉得Linq提供了更干净的代码,而不是这个费劲的循环!