检查对象数组中的重复项

本文关键字:对象 数组 检查 | 更新日期: 2023-09-27 18:01:29

我有以下对象数组,从自定义类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的访问器。我想我的问题是为什么这个代码不工作?

谢谢

检查对象数组中的重复项

当前代码将在房间名称不等于新房间时立即添加房间。相反,首先检查没有的房间有现有的名称和只有在添加它:

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();
    }
}

你的代码每次在当前数组中有不匹配的房间时触发addRoom()

我想,你正在寻找这样的东西:

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

或使用All法:

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

您应该在添加新房间之前完成整个数组的循环。如果你有一个新的房间名称,它将调用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();

就像其他人已经说过的那样,你的代码没有任何意义。创建一个房间数组,保留所有元素未初始化(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();
    }
}

假设房间名称是房间的某种唯一密钥,您也可以使用HashSet<Room>,然后添加房间。HashSet将检查房间是否存在。然而,您的Room类需要覆盖EqualsGetHashCode,然后用Equals检查房间名称的相等性。