2017-05-21 1 views
0

MainメソッドとControllerクラスの2つのバリデーションで問題が発生しています。C#オブジェクトがnullの場合にループを検証する方法を作成する

これは、メインの静的メソッドです。基本的に私は、 "従業員"のIDを入力するようにユーザーに依頼し、IDはEmployeeというクラスのプロパティです。その従業員が存在するかどうかを示すメッセージを表示します。すでに作成された複数のEmployeeオブジェクトがあるとします。私はそれがwhileループの一種だと知っていますが、私はそれを正しく理解できません。

コントローラクラス内のメソッドは正しいので、何も変更する必要はありません。基本的にIDを受け取り、Employeeオブジェクトが存在しない場合はnullを返し、存在する場合はオブジェクトを返します。私はその従業員が存在しない場合にそのnullを取る必要があり、彼がするまで正しいIDを入力するようにユーザーに依頼し続けるループを作成し、ループが終了します。ありがとう、申し訳ありませんが正しく説明しなかった場合。

public static void mymethod() 
    { 
     Console.WriteLine("Please enter your Employee ID: "); 
     int ID = Convert.ToInt32(Console.ReadLine()); 
     Console.WriteLine("----------------------------"); 
     Employee employee = controllerclass.findemployee(ID); 
     int i = 0; 
     bool flag = false; 
     while (!flag) 
     { 
      if (!flag) 
      { 
       if (ID != null) 
       { 
        Console.WriteLine("The employee exists"); 
        flag = true; 
       } 
       else 
       { 
        Console.WriteLine("Please enter a valid ID"); 
       } 
      } 
      i++; 
     } 

コントローラクラス内のメソッドは正しいので、何も変更する必要はありません。基本的にIDを受け取り、Employeeオブジェクトが存在しない場合はnullを返し、存在する場合はオブジェクトを返します。私はその従業員が存在しない場合にそのnullを取る必要があり、彼がするまで正しいIDを入力するようにユーザーに依頼し続けるループを作成し、ループが終了します。しばらくは、それが少なくとも一度起こる確かめる行う

boolean flag = false; 
do { 
    if(flag) 
     Console.WriteLine("Please enter a valid ID"); 
    else 
     Console.WriteLine("Please enter your Employee ID: "); 
    try{ 
     int ID = Convert.ToInt32(Console.ReadLine()); 
    } catch (FormatException e){ 
     Console.WriteLine("Please enter an integer"); 
     flag = false; 
     continue; 
    } 
    employee = controllerclass.findemployee(ID); 
    flag = true; 
} while (employee == null) //employee will be null if not found 
Console.WriteLine("The employee exists"); 

:私は、正しく

答えて

1

がdo-whileループを使用して、このような何かを、それを説明しなかった場合は申し訳ありません、ありがとうございます。条件付きフラグは、最初のエントリの後に発生します。彼らが初めてそれを得るなら、それは決して起こらないでしょう。

+0

IDはintなので、nullになることはありません。 – Harminder

+0

良い点。私は質問者のコードに基づいています。私はそれを反映する答えを編集します。 – jimboweb

+0

ありがとうございました@jimboweb、あなたのコードを取っていくつかのものを変更しました。 noobieを助ける時間をとってくれてありがとう。 – Gonzalo

1

詳細な説明の1つは、値型であるためintがnullになることはありません。 int?に変更することができます。これはnullableintです。値はnullでもかまいません。

whileループの作業を行うための鍵は、チェックする条件を変更しなければならないということです。内部ループです。

この場合、ループが始まる前にIDが設定されており、ループ内には何も変更されません。

あなたはこのようなことをすることができます。 (これは私が通常行うよりも、もう少しネスティングであるが、それは動作します。)

public static void mymethod() 
{ 
    Employee employee = null 
    while(employee == null) 
    { 
     Console.WriteLine("Please enter your Employee ID: "); 
     int ID = 0; 
     var input = Console.ReadLine(); 
     if(int.TryParse(input, out ID)) 
     { 
      employee = controllerclass.findemployee(ID); 
      if(employee == null) 
      { 
       Console.WriteLine("The employee does not exist"); 
      } 
      else 
      { 
       Console.WriteLine("The employee exists"); 
      } 
     } 
     else 
     { 
      Console.WriteLine("Please enter a valid ID."); 
     } 
    } // Doesn't exit the loop until we have an employee 

ループは限りemployeeがnullとして実行されます。したがって、有効な従業員を返す何かを入力するまで、それは継続します。

私はint.TryParseを使用して、入力した値を確認しました。入力した内容が整数の場合はtrueを返し、そうでない場合はfalseを返します。そうすれば、有効な整数を入力した場合、その従業員をチェックします。それが有効な整数でなくても、それを知ることができます。

whileループを考える1つの方法は、ループを終了する前に会うべき条件を考えることです。この場合、employeeはnull以外にする必要があります。ループはwhile(employee==null)で始まります。

+0

ありがとうございました! – Gonzalo

2

条件が満たされるまで(idが見つかるまで)少なくとも何回か何度もやりたいことがあるときはいつでも、do while構成を使うべきです。

int id; 
bool idIsNotNumeric = true; 
do 
{ 
    Console.WriteLine("Please enter your Employee ID: "); 
    string idEntered = Console.ReadLine(); 
    idIsNotNumeric = !int.TryParse(idEntered, out id); 

    // other stuff you want to keep doing 

} while (idIsNotNumeric || controllerclass.findemployee(id) == null); 

Console.WriteLine("The employee exists"); 
+0

あなたの答えをありがとう、私は問題を解決することができました。 – Gonzalo

関連する問題