0

このプログラムの背景は非常に単純です。ユーザーが任意の文字 (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 に答える