【问题标题】:Pulling/adding specific values out of an array using a for-loop使用 for 循环从数组中提取/添加特定值
【发布时间】:2013-10-02 21:40:22
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    改变这个:

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

    【讨论】:

    • 是的,您可能还想确保它不区分大小写。你可以重载 StartsWith 来处理你喜欢的情况。
    【解决方案2】:

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

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

    而不是你的“for”循环。

    【讨论】:

    • +1,这也是我要做的。不想将逻辑纠错与完全算法替换混为一谈。
    • 不错。添加案例处理程序并修剪 TextBox... States.Count(state => state.Substring(0, 1).ToUpper() == myLetter.Trim().ToUpper());
    • @CoryNelson 我同意你回答了这个问题,但是当我看到这样的问题时,我总是觉得 Linq 提供了更简洁的代码,而不是这种费力的 for 循环!
    【解决方案3】:

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

    //-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 开头的单词,就会停下来。

    【讨论】:

      【解决方案4】:

      使用 Lambda

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-25
        • 2018-03-05
        • 2020-09-07
        相关资源
        最近更新 更多