检查对象数组中的重复项
本文关键字:对象 数组 检查 | 更新日期: 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
类需要覆盖Equals
和GetHashCode
,然后用Equals
检查房间名称的相等性。