2008-11-14 88 views
5

我有一个包含称为Room的项目的数组列表。每个房间都有房型,如厨房,接待处等。 我想检查数组列表,查看是否有任何类型的房间存在之前,将其添加到列表中。 任何人都可以推荐一个干净的方式做到这一点,而不需要多个foreach循环?检查arraylist中的重复项

(.NET 2.0)


因为我在.NET 2.0上运行我还没有配齐了LINQ技术。我应该在问题中说明这一点。 道歉

回答

10

我不会在这里使用ArrayList;既然你有.NET 2.0,使用List<T>和所有变得简单:

List<Room> rooms = ... 
string roomType = "lounge"; 
bool exists = rooms.Exists(delegate(Room room) { return room.Type == roomType; }); 

或用C#3.0(仍靶向.NET 2.0)

bool exists = rooms.Exists(room => room.Type == roomType); 

或用C#3.0,要么LINQBridge或.NET 3.5 :

bool exists = rooms.Any(room => room.Type == roomType); 

(该Any使用将与更多类型的工作,而不仅仅是List<T>

1
if (!rooms.Any (r => r.RoomType == typeToFind /*kitchen, ...*/)) 
    //add it or whatever 
+0

啊我的道歉,我对.NET 2遗憾的是 – anonym0use 2008-11-14 11:16:36

0

我认为使用列表和做存在的地方需要的时间是O(n)。 使用Dictionary而不是O(1),如果内存不是问题,则优先使用。

如果您不需要顺序表中我会尝试使用Dictionary这样的:

Dictionary<Type, List<Room>> rooms = new Dictionary<Type, List<Room>>; 

void Main(){ 
    KitchenRoom kr = new KitchenRoom(); 
    DummyRoom dr = new DummyRoom(); 
    RoomType1 rt1 = new RoomType1(); 
    ... 

    AddRoom(kr); 
    AddRoom(dr); 
    AddRoom(rt1); 
    ... 

} 

void AddRoom(Room r){ 
    Type roomtype = r.GetType(); 
    if(!rooms.ContainsKey(roomtype){ //If the type is new, then add it with an empty list 
    rooms.Add(roomtype, new List<Room>); 
    } 
    //And of course add the room. 
    rooms[roomtype].Add(r); 
} 

你基本上有不同的roomtypes的列表。但是,如果你不需要数组列表,这个解决方案就可以。但对于大型列表来说,这将是最快的。

我有一个解决方案一次与List<string>与300.000 +项目。将每个元素与几乎相同大小的其他列表进行比较需要花费12个小时才能完成。将逻辑切换为使用字典而不是12分钟。对于更大的名单,我总是去Dictionary<mytype, bool>其中布尔只是一个虚拟没有被使用。

0

不使用lambda表达式:

void AddRoom(Room r, IList<Room> rooms, IDictionary<string, bool> roomTypes) 
{ 
    if (!roomTypes.Contains(r.RoomType)) 
    { 
     rooms.Add(r); 
     roomTypes.Add(r.RoomType, true); 
    } 
} 

实际上它并不不管什么价值的字典中的类型是什么,因为你曾经看的唯一的事情是关键。

0

另一种方法是对数组进行排序,然后遍历元素直到找到一对相邻的重复项。把它做到最后,并且数组是无损的。

1

从你的问题来看,如果你想强制规定可能只有一个给定类型的房间,或者如果你只是想知道的话,那么对我来说这并不是100%清楚。

如果您有一个不变量,即Room的集合可能有多个相同的Room类型,则可以尝试使用Dictionary<Type, Room>

这样做的好处是不会对添加进行线性搜索。

你会使用以下操作添加一个房间:

if(rooms.ContainsKey(room.GetType())) 
{ 
    // Can't add a second room of the same type 
    ... 
} 
else 
{ 
    rooms.Add(room.GetType(), room); 
}