2

私は最近、私が理解しようとしている小さな問題があることを除いて、私が取り組んできた小さなプロジェクトを終了しました。

このプロジェクトは、SOAP クライアントを使用する C# Web サービスを、要求クラスと応答クラスの両方と共に利用します。このプロジェクトは、入力されたデータを保存するように設計されています。それが行うことは、映画館の列のある座席を予約し、その座席を予約し、その座席を再度選択して、その列の別の空席を (フォーム内で) 見つけようとすると、両方が「0」と表示されることです。 "。ただし、別の行の別の座席を予約すると、そのデータはキャッシュに正常に保存されますが、コードの「else if」ステートメント内に他の座席と行は表示されません。

Webservice の Webmethod は次のとおりです。

public string Name { get; set; } //gets and sets the Name from the ReserveSeatResponse
    public int Row { get; set; } //gets and sets the Row from the ReserveSeatResponse
    public int Seat { get; set; } //gets and sets the Seat from the ReserveSeatResponse

    private const int maxRows = 13; //sets the max amount of Rows in the Array tried setting the rows to 12, but since the array starts at 0, I had to set the Rows to 13)
    private const int maxSeats = 17; //sets the max amount of Seats in the Array (tried setting the seats at 16, but since the array starts at 0, I had to set it to 17)



    private bool[,]reservedSeats = new bool[13, 17]; //same description above, but this sets a boolean in the reserved seats, to check if its taken or no)
    private bool[,]reservedRows = new bool[13, 17]; //same description for the max row/seats.

    [WebMethod]
    public GetSeatResponse Booking (GetSeatRequest req)
    {

        GetSeatResponse resp = new GetSeatResponse();
      //  resp.Seat = req.SeatNumber;
      //  resp.Row = req.RowNumber;
        object abc = HttpContext.Current.Cache["CinemaReservation"];

        //if the cache does not exist
        if (abc == null)
        {
            //creates a blank multidimensional array
            reservedSeats = new bool[maxRows,maxSeats];

        }
        //if the cache exists
        else
        {
            //using the cache object as an array

            try
            {
                reservedSeats = (bool[,])abc;
            }
            catch
            {

            }
        }

        //if the seat is vacant
        if (reservedSeats[req.RowNumber, req.SeatNumber] != true)
        {
            resp.Name = req.Name;
            resp.Seat = req.SeatNumber;
            resp.Row = req.RowNumber;
            reservedSeats[req.RowNumber, req.SeatNumber] = true;
            HttpContext.Current.Cache["CinemaReservation"] = reservedSeats;
            return resp;
        }
        //if the seat is taken

        else if (reservedSeats[req.RowNumber, req.SeatNumber] != true)
        {
            bool breakTest = false;
            string Name = req.Name;
            int row = req.RowNumber;
            int seat = req.SeatNumber;
            for (int i = row; i < reservedSeats.GetLength(0); i++)
            {
                for (int j = seat; j < reservedSeats.GetLength(1); j++)
                {
                    if (reservedSeats[i, j] !=true )
                    {
                        resp.Name = Name;
                        resp.Row = i+1;
                        resp.Seat = j+1;
                        reservedSeats[i, j] = true;
                        breakTest = true;
                        break;
                    }

                }
                seat = 0;
                if (breakTest == true)
                {
                    break;
                }

            }

            //getNextSeat(req, resp, reservedSeats);
            HttpContext.Current.Cache["CinemaReservation"] = reservedSeats;


        }

        return resp;

そして、これがWebサービスから呼び出すメソッドで私が行き詰まっている部分です

if (resp.erroresp != true)
            {
                if ((resp.Row > 0) && (resp.Seat > 0))
                {
                    MessageBox.Show(String.Format("Hi there {0}!!, you have reserved a Seat at Row: {1} in Seat Number : {2}", resp.Name, resp.Row, resp.Seat));
                }

                else if (resp.erroresp != true)
                {
                    if ((resp.Row < 1) && (resp.Seat < 1))
                    {
                        MessageBox.Show(String.Format("Sorry, your selected Seat has been taken, however there is an available seat at row {0} in seat {1}", resp.Row, resp.Seat));
                    }
                }


            }
4

2 に答える 2

2

あなたのコードにはいくつか問題があります。

サーバ側:

  • reservedRows使用されることはありません。その目的は何ですか?
  • 定数を定義maxRowsしますが、使用しません。書く

    private bool[,]reservedSeats = new bool[maxRows, maxSeats]
    
  • 両方のチェック (着席か否か) で同じ条件を使用しますが、これは機能しません。書くだけ:

    if (!reservedSeats[req.RowNumber, req.SeatNumber]) {
        // Seat is free
    } else {
        // Seat is taken
    }
    
  • 返された座席が代替かどうかを区別したい場合は、応答にブール値フラグを含めるか、次のような列挙を含める必要があります。

    public enum ResultEnum {
      Ok,         // the requested seat is free
      Full,       // no seat is available
      Alternative // you got another seat
    }
    

クライアント側:

  • あなたのチェックはやや冗長で ( を 2 回チェックしますresp.erroresp != true)、まったく明確ではありません。

  • 列挙型でアプローチを使用する場合、次のように確認できます。

    switch (resp.Result) {
       case ResultEnum.Ok:
         break;
       case ResultEnum.Full:
         break;
       case ResultEnum.Alternative:
         break;
    }
    
于 2012-11-20T08:52:30.817 に答える
0

私はurコードに2つのエラーを見つけました!まず、次の後に2次元配列の初期化を確認できませんでした。

`if (abc == null)
    {
        //creates a blank multidimensional array
        reservedSeats = new bool[maxRows,maxSeats];

    }`

次に、if else条件(reservedSeats [req.RowNumber、req.SeatNumber]!= true)はまったく同じです!

お役に立てれば

于 2012-11-20T08:27:52.620 に答える