-1

我有以下对象数组,从自定义类 Room 创建。在向阵列添加新房间之前,我想验证 Roomname 是否已经在阵列中。这是我正在尝试的示例:

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方法范围之外的数组中。我希望这不是您的实际代码!

因此,首先应该将房间数组创建为btnAddRm_Click方法范围之外的类的字段。

由于您要添加房间,因此不应使用数组。用一个List<Room>。否则你需要知道你的数组中有多少元素已经被一个房间初始化了。如果数量超过数组的初始大小,您还需要增加数组。这正是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();
    }
}

假设房间名称是房间的某种唯一键,您也可以使用 aHashSet<Room>然后添加房间。HashSet将检查房间的存在。但是,您的Room班级需要覆盖EqualsGetHashCode然后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();

你也可以使用扩展方法来压缩你的 for 循环Any,你需using System.Linq要这样做。

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