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

时间:2013-10-02 21:40:23

标签: c# arrays if-statement for-loop

这个程序的背景很简单:我希望用户能够在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。我觉得我需要另一行代码直接用于循环到总值。我是对的吗?

4 个答案:

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

答案 1 :(得分:3)

Linq可用于更有说服力的解决方案,即使用:

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

而不是你的“for”循环。

答案 2 :(得分: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)开头的单词,你就会停止。

答案 3 :(得分:0)

使用Lambda

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