4

ここで壁にぶつかったので、誰か助けてください。無効な値が原因でループから抜け出したことをどのように検出できますか。

たとえば、誰かが子供の年齢 3 5 6 7 9 を入力すると問題ありません。o 3 5 6 7 を入力すると、私のコードでは -1 が返され、ループが終了します。

それを検出してメッセージを返すにはどうすればよいですか

public static int IntIsValid(string p)
        {
            int pn;
            bool isNum = int.TryParse(p, out pn);
            int pnIsvalid = isNum ? pn : -1;
            return pnIsvalid;
        }

string addDash  = Regex.Replace(agesOfChildren, " ", "_");
            string[] splitNumberOfChildren  = addDash.Split('_');
            string splitChildrensAge        = string.Empty;
            int checkAgeOfChildren          = 0;
            string problem = string.Empty;
            foreach (var splitAgeOfChild in splitNumberOfChildren)
            {
                splitChildrensAge           = splitAgeOfChild;
                checkAgeOfChildren          = RemoveInvalidInput.IntIsValid(splitChildrensAge);
                if (checkAgeOfChildren == -1)
                {
                    problem = "problem with age, stop checking";
                    break;
                }
            }

だから私は何かをしたいと思います

if(error with loop == true)
{
ViewBag.Message = problem;
}

私が空白になったので、誰かが助けてくれることを願っています

ジョージ

4

5 に答える 5

6

簡単です、あなたはすでに自分で答えを出しています:

boolean error_with_loop = false;
foreach (var splitAgeOfChild in splitNumberOfChildren) {
      splitChildrensAge           = splitAgeOfChild;
      checkAgeOfChildren          = RemoveInvalidInput.IntIsValid(splitChildrensAge);
      if (checkAgeOfChildren == -1)
      {
           error_with_loop = true;
           problem = "problem with age, stop checking";
           break;
      }
}

if (error_with_loop) {
    ViewBag.Message = problem;
}

または、次をスローしますException

try {
    foreach (var splitAgeOfChild in splitNumberOfChildren) {
          splitChildrensAge           = splitAgeOfChild;
          checkAgeOfChildren          = RemoveInvalidInput.IntIsValid(splitChildrensAge);
          if (checkAgeOfChildren == -1)
          {
                // note: no need to break
                throw new ErrorWithLoopException();
          }
    }
} catch (ErrorWithLoopException e) {
    ViewBag.Message = problem;
}

実際、ある種の整数検証を使用しているようです。クラスにはInt32例外があります: http://msdn.microsoft.com/en-us/library/system.int32.parse%28v=vs.71%29.aspxコードは実際には短くなります (わかりません)該当する場合は、検証コードが追加で何をするかわからないため):

try {
    foreach (var splitAgeOfChild in splitNumberOfChildren) {
          splitChildrensAge           = splitAgeOfChild;
          checkAgeOfChildren          = Int32.Parse(splitChildrensAge);
    }
} catch (FormatException e) {
    ViewBag.Message = problem;
}
于 2013-04-23T13:23:53.397 に答える
2

(プログラムの設計に応じて) 例外をスローするか、フラグを設定することができます。

bool success = true;

foreach (var splitAgeOfChild in splitNumberOfChildren)
{
      splitChildrensAge = splitAgeOfChild;
      checkAgeOfChildren = RemoveInvalidInput.IntIsValid(splitChildrensAge);
      if (checkAgeOfChildren == -1)
      {
           problem = "problem with age, stop checking";
           success = false; // change the flag
           break;
      }
}

または例外を使用します (ここではArgumentOutOfRangeExceptionを使用しましたが、独自に作成することもできます):

foreach (var splitAgeOfChild in splitNumberOfChildren)
{
      splitChildrensAge = splitAgeOfChild;
      checkAgeOfChildren = RemoveInvalidInput.IntIsValid(splitChildrensAge);
      if (checkAgeOfChildren == -1)
      {
           problem = "problem with age, stop checking";
           throw new ArgumentOutOfRangeException("Age", problem);
      }
}
于 2013-04-23T13:24:02.593 に答える
1

ループ内でこれを好まないのはなぜですか:

 if (checkAgeOfChildren == -1)
                {
                    ViewBag.Message  = "problem with age, stop checking";
                    break;
                }
于 2013-04-23T13:28:58.343 に答える
1

最後にチェックしてみませんstring.Emptyか?エラーがある場合にのみ設定されます。

if (!string.IsNullOrEmpty(problem))
{
     ViewBag.Message = problem;
}
于 2013-04-23T13:25:07.817 に答える
1

単に行う:

if (checkAgeOfChildren == -1)
{
  problem = "problem with age, stop checking";
  break;
}

if (!string.IsNullOrEmpty(problem)) {
   ViewBag.Message = problem;
}

例外をスローすることもできます。

try { 
   if (checkAgeOfChildren == -1)
   {
      throw new ArgumentException("Invalid Argument");
   }  catch (ArgumentException e) 
   {
       ViewBag.Message = e.Message;
   }
}

ArgumentExceptionより適切な、またはカスタムの例外に置き換えることができます。

于 2013-04-23T13:25:10.693 に答える