0

Aからまでの文字を含む定義済みの文字列配列がありますQ

string[] SkippedAreasArray = new string[] {"A", "B", "C", "D", "E", "F", "G",
            "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q"};

内部 Windows フォームではTextBox、ユーザーは次のように skippedAreas を入力できA,B,C,D...ます。入力がこの形式であることが保証されるように、文字とコンマのみを使用するための検証と制限があります。

私がしていることは、ユーザー入力を取得して別の文字列配列に入力することです:

string[] SkippedAreasFromForm = new string[17];
...
SkippedAreasFromForm = (txtSkippedAreas.Text).Split(',');

ここで、私が支援を求めているトリッキーな部分が来ます。ユーザーは、たとえば -3 と入力する必要がNumber of areasあります。エリアの数が 2 の場合、彼はのみ使用でき、エリアの数が 4 の場合、 、、およびが使用可能です。ABCABABCD

必要なのは、ユーザー入力が取り込まれた配列SkippedAreasFromFormに上記の基準に一致しない領域があるかどうかを確認することです。

これがコーディングで意味すること - からすべての要素を SkippedAreasFromForm取得し、定義済みの整数値を取得して、SkippedAreasArrayこの値が「領域の数」として入力した値と等しいか、それよりも大きい (>=) かどうかを確認する必要があります。選択した番号の範囲外の領域がある場合は、エラーが表示されます。

私が今持っているのは:

foreach (string tempAreaValue in SkippedAreasFromForm)
                {
                    for (int i = 0; i < SkippedAreasArray.Length; i++)
                    {
                        if (tempAreaValue == SkippedAreasArray[i])
                        {
                            if ((i + 1) > entity.AreasCnt)
                            {
                                MessageBox.Show("You must use areas only within the Number of Areas scope!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                txtSkippedAreas.Focus();
                                return false;
                            }
                        }
                    }
                }

いくつかのテストでは、私はそれを動作させました。しかし、最初に-少なくとも私にとっては複雑すぎるようです。2 つ目 - このアルゴリズムが必要に応じて正確に機能しているかどうかはわかりません。または、運によって正しい結果が得られているだけです。3 番目 - 私は現在 2 か月間 C# をコーディングしていますが、これは LINQ 式の優れた候補のように思えます。

4

2 に答える 2

5

私はあなたが探しているだけだと思いますIndexOf

int index = SkippedAreasArray.IndexOf(tempAreaValue);
if (index >= entity.AreasCnt)
{
    ...
}

(index要素がリストにまったくない場合に発生する -1 であることを確認することもできます。また、重複を考慮してください。ユーザーはA, A, を入力できAますか?)

于 2013-04-01T09:30:27.377 に答える
1

areaNumber に基づいて、開始インデックスから最大文字列要素までの配列内の要素を探している場合は、次のようになります。

int areaNumber = 4;
var result = SkippedAreasArray.Select((r, i) => new { Value = r, Index = i })
                              .Where(r => r.Index <= areaNumber - 1)
                              .Select(r => r.Value)
                              .ToArray();

areaNumber 4あなたが得るために"A", "B", "C", "D"

編集:

ユーザー入力のすべての要素(配列A、C、H、Q ..)がareNumberから決定された領域内にあるかどうかを調べています(コメントから)

userInputArray が次のとおりであるとします。

string[] userInputArray = new string[] {"A", "C", "H", "Q"};

Enumerable.Exceptその後、次の方法で使用できます。

if(result.Except(userInputArray).Any())
{
  //Invalid
}
else
{
 //Valid
}
于 2013-04-01T09:34:36.197 に答える