检查对象数组中的重复项?

时间:2013-02-26 21:57:26

标签: c#

我有一个从自定义类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 个答案:

答案 0 :(得分:1)

当房间的名称不等于新房间时,您当前的代码将添加房间。 相反,首先检查房间的 none 是否具有现有名称,然后再次添加它:

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

答案 1 :(得分:0)

每次当前阵列中存在不匹配的房间时,您的代码会触发addRoom()

我想,你正在寻找类似的东西:

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

或使用All方法:

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

答案 2 :(得分:0)

您应该在添加新房间之前完成整个阵列的循环。如果您的新房间名称与任何现有房间都不匹配,那么您将拥有20次电话addRoom()

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扩展方法压缩循环,您需要using System.Linq这样做。

if (!roomArray.Any(room => room.GetRoomName() == test))
    addRoom();

答案 3 :(得分: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();
    }
}

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