2011-06-02 52 views
5

如果某些criterai匹配,但是在删除并再次循环后触发错误,我试图为每个循环移除当前项目。如果某些标准匹配,从列表中删除当前项目

我的示例代码:

 For Each Item As BookingRoom In myBookedRooms 
      If Item.RoomInfo.UIN = myRoom.UIN Then 
       myBookedRooms.Remove(Item) 
       Continue For 
      End If 
     Next 

* 注RoomInfo和myRoom是房类

我使用myBookedRooms.remove但其trigerring错误等什么可以做这件事的正确方法这两个实例?即删除预订的房间,如果房间号与所选房间相匹配

回答

9

问题是您在修改集合的同时迭代它。

你可以用一个for循环迭代列表反向:

For i = myBookedRooms.Count - 1 To 0 Step -1 
    If myBookedRooms(i).RoomInfo.UIN = myRoom.UIN Then 
     myBookedRooms.RemoveAt(i) 
    End If 
Next 

或者,你可以使用RemoveAll method

myBookedRooms.RemoveAll(Function(item) item.RoomInfo.UIN = myRoom.UIN) 

另一种选择是使用Enumerable.Where method过滤结果,但与前两种方法不同,您需要将您的逻辑检查取消,以排除匹配项目,因为其意图是将其删除:

myBookedRooms = myBookedRooms 
        .Where(Function(item) item.RoomInfo.UIN <> myRoom.UIN) 
        .ToList() 
+0

'.Except(...).ToList()'也可以。 – 2011-06-02 13:23:24

+0

@Joel你的意思是在哪里? '除外'将需要第二个序列。已更新为包含“Where”。 – 2011-06-02 13:31:31

+0

是的,我的意思是Where():( – 2011-06-02 13:59:28