-1

カスタム クラス Room から作成された次のオブジェクト配列があります。新しい部屋を配列に追加する前に、部屋名がまだ配列にないことを確認したいと思います。ここに私が試しているもののサンプルがあります:

private void btnAddRm_Click(object sender, EventArgs e)
{
Room[] roomArray = new Room[20];
test = txtName.text;

for (int i = 0; i < roomArray.length; i++)
{
     if(test != roomArray[i].getRoomName())
     {
          addRoom();
     }
}
}

GetRoomName()RoomNameクラスからを取得するアクセサです。私の質問は、なぜこのコードが機能しないのですか?

ありがとうございました

4

4 に答える 4

1

現在のコードは、部屋の名前が新しい部屋と一致しなくなるとすぐに部屋を追加します。代わりに、最初に既存の名前の部屋がないことを確認してから追加します。

private void btnAddRm_Click(object sender, EventArgs e)
{
    Room[] roomArray = new Room[20];
    test = txtName.text;
    bool exists = false;

    for (int i = 0; i < roomArray.length; i++)
    {
         if (test == roomArray[i].getRoomName())
         {
              exists = true;
              break;
         }
    }
    if (!exists)
    {
        addRoom();
    }
}
于 2013-02-26T22:00:48.970 に答える
0

他の人がすでに述べたように、あなたのコードは意味がありません。部屋の配列を作成し、すべての要素を初期化しないままにします ( null)。次に、その配列内に部屋が存在するかどうかを確認します。また、ループでは、要素の名前が異なるたびに新しい部屋を「追加」します。メソッドの範囲外にある配列に何かを追加する方法がわかりませんaddRoom。これがあなたの実際のコードでないことを願っています!

そのため、最初に room 配列をbtnAddRm_Clickメソッドのスコープ外のクラスのフィールドとして作成する必要があります。

部屋を追加したいので、配列を使用しないでください。List<Room>代わりにaを使用してください。それ以外の場合は、配列のいくつの要素が既に部屋で初期化されているかを知る必要があります。また、数が配列の初期サイズを超える場合は、配列を大きくする必要があります。これはまさにList<Room>あなたのためにできることです。

btnAddRm_Clickその後、イベント ハンドラーは LINQ を使用して、同じ名前の部屋が存在するかどうかを確認できます。String.Compare(name1, name2)の代わりに使用する必要があることに注意してくださいname1 == name2

private List<Room> _theRooms = new List<Room>();

private void btnAddRm_Click(object sender, EventArgs e)
{
    if (!_theRooms.Any(r => string.Compare(r.Name, txtName.Text, StringComparison.CurrentCultureIgnoreCase) == 0))
    {
        addRoom();
    }
}

部屋名が部屋の一意のキーであると仮定すると、 a を使用しHashSet<Room>て部屋を追加することもできます。HashSet部屋の存在を確認します。ただしRoom、クラスは上書きEqualsしてから、部屋名が等しいかどうかを確認するGetHashCode必要があります。Equals

于 2013-02-26T23:23:10.617 に答える
0

addRoom()現在の配列に一致しない部屋があるたびにコードが起動します。

私は、あなたがそのようなものを探していると思います:

if(!roomArray.Any(r => r.getRoomName() == test))
    addRoom();

またはAll方法を使用する:

if(roomArray.All(r => r.getRoomName() != test))
    addRoom();
于 2013-02-26T22:00:12.210 に答える
0

新しい部屋を追加する前に、アレイ全体のループを終了する必要があります。既存の部屋と一致しない新しい部屋名がある場合、addRoom()20回呼び出します。

Room[] roomArray = new Room[20];
test = txtName.text;

bool doesRoomExist = false;
for (int i = 0; i < roomArray.length; i++)
{
    if (test == roomArray[i].getRoomName())
    {
        doesRoomExist = true;
        break;
    }
}

if (!doesRoomExist)
   addRoom();

Any拡張メソッドを使用して for ループを圧縮することもできますusing System.Linq。これを行う必要があります。

if (!roomArray.Any(room => room.GetRoomName() == test))
    addRoom();
于 2013-02-26T22:01:19.893 に答える