我有一个包含称为Room的项目的数组列表。每个房间都有房型,如厨房,接待处等。 我想检查数组列表,查看是否有任何类型的房间存在之前,将其添加到列表中。 任何人都可以推荐一个干净的方式做到这一点,而不需要多个foreach循环?检查arraylist中的重复项
(.NET 2.0)
因为我在.NET 2.0上运行我还没有配齐了LINQ技术。我应该在问题中说明这一点。 道歉
我有一个包含称为Room的项目的数组列表。每个房间都有房型,如厨房,接待处等。 我想检查数组列表,查看是否有任何类型的房间存在之前,将其添加到列表中。 任何人都可以推荐一个干净的方式做到这一点,而不需要多个foreach循环?检查arraylist中的重复项
(.NET 2.0)
因为我在.NET 2.0上运行我还没有配齐了LINQ技术。我应该在问题中说明这一点。 道歉
我不会在这里使用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>
)
if (!rooms.Any (r => r.RoomType == typeToFind /*kitchen, ...*/))
//add it or whatever
我认为使用列表和做存在的地方需要的时间是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>
其中布尔只是一个虚拟没有被使用。
不使用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);
}
}
实际上它并不不管什么价值的字典中的类型是什么,因为你曾经看的唯一的事情是关键。
另一种方法是对数组进行排序,然后遍历元素直到找到一对相邻的重复项。把它做到最后,并且数组是无损的。
从你的问题来看,如果你想强制规定可能只有一个给定类型的房间,或者如果你只是想知道的话,那么对我来说这并不是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);
}
啊我的道歉,我对.NET 2遗憾的是 – anonym0use 2008-11-14 11:16:36