我有一个arraylist,其中包含名为Room的项目。每个房间都有房型,如厨房,接待处等。 我想在将它添加到列表之前检查arraylist以查看是否存在该类型的任何房间。 任何人都可以推荐一种简洁的方法,而不需要多个foreach循环吗?
(。NET 2.0)
我在.net 2.0上运行时无法访问linq技术。我应该在问题中说明。 道歉
答案 0 :(得分: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 :(得分:1)
if (!rooms.Any (r => r.RoomType == typeToFind /*kitchen, ...*/))
//add it or whatever
答案 2 :(得分: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);
}
答案 3 :(得分: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);
}
你基本上有一个不同的房型列表。但是这个解决方案只有在你不需要arraylist时才可以。但对于大型列表,这将是最快的。
我有一个解决方案,List<string>
有300.000 +项。将每个元素与另一个几乎相同大小的列表进行比较需要大量的12小时才能完成。将逻辑切换为使用Dictionary而不是12分钟。对于较大的列表,我总是去Dictionary<mytype, bool>
,其中bool只是一个不使用的假人。
答案 4 :(得分: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);
}
}
字典中值的类型实际上并不重要,因为你唯一看到的就是键。
答案 5 :(得分:0)
另一种方法是对数组进行排序,然后遍历元素,直到找到一对相邻的重复项。使它到最后,阵列是无欺骗的。