オースティンが指摘したように、while ループ ステートメントで ReadLine を 2 回使用しています。
言及する価値のあることの 1 つは、モジュール性のルールに従うようにすることです。これにより、コードの実装とデバッグが高速化されます。
C# プログラミングを久しぶりに行ったので、これを Java スタイルで sudo コーディングしました。
これはコマンド ライン プログラミングであるため、おそらくユーザー入力を複数回検証する必要があります。私がすることの 1 つは、ユーティリティ クラスを作成して、一般的なユーザー入力タスクを含めることです。
public class TerminalUtil {
    private TerminalUtil() {}
    public static boolean isYes(String msg){ return (msg.ToUpper() == "Y" || msg.ToUpper() == "YES"); }
    public static boolean isNo(String msg){ return (msg.ToUpper() == "N" || msg.ToUpper() == "NO"); }
   // You also might want basic conditionals to check if string is numeric or contains letters.
    // I like using recursion for command line utilities so having a method that can re-print messages is handy
    public static void display(String[] messages){
        for(String msg : messages){
            Console.WriteLine(msg);
        }
    }
    public static boolean enterYesOrNo(String[] messages, String[] errorMessages){
        display(messages)
        String input = Console.ReadLine();
        if( isYes(input) ){
            return true;
        } else if( isNo(input) ){ 
            return false; 
        } else {
             display(errorMessages); // Maybe something like, you didn't enter a yes or no value.
             enterYesOrNo(messages, errorMessages); // Recursive loop to try again.
        }
    }
}
ピザを注文するコードは次のようになります
public class OrderPizza{
    public static int selectToppings(){
        String[] message = new String[4];
        message[0] = ("\nSelect additional topping/s\n");
        message[1] = ("1 - Extra meat: 200");
        message[2] = ("2 - Extra cheese: 100");
        message[3] = ("3 - Extra veggies: 80\n");
       int option =  TerminalUtils.entryNumeric(message, {"You entered an non-numeric character, try again"} );
       if( option > 0 && option <= 3 ){
           return option;
       } else {
          Console.WriteLine("Number must be between 1 - 3, try again.");
          return selectToppings();
       }
    }
    public static Pizza order(){
        Pizza pizza = new Pizza();
        while(true){
            int toppingCode = selectTopping();
            pizza.addTopping(toppingCode);
            if(!TerminalUtil.enterYesOrNo({"\nAdd more toppings? Y/N"}, {"Please enter a 'Y'es or 'N'o"}) ){
                break;
            }
        }
    }
}
これの主な利点は、while ループのビジネス ロジックが削減され、TerminalUtils でコードを再利用できることです。また、これは決してエレガントなソリューションではありません。私は怠け者で、現在午前 3 時の IRL ですが、ボールが転がるには十分なはずです。
おそらく再考すべきことの 1 つは、トッピングを表すために整数コードを使用することです。列挙型を使用すると、実装が容易になる場合があります。
また、3 つの異なるタイプのピザを追加していることにも気付きました。これは、3 つの別個のオブジェクトであると想定しています。
ピザにトッピングを追加するためにループしているので、ピザの抽象クラスを作成します。このようにして、ペパロニやチーズなどの一般的な事前構築済みのピザを拡張し、顧客に注文をカスタマイズしてもらいたい場合は、抽象的なピザ クラスを使用できます。