Tôi đã nghĩ đến việc sử dụng danh sách và thực hiện Exists khi một hoạt động mất thời gian O(n)
. Sử dụng Dictionary
thay vì là O(1)
và được ưu tiên nếu bộ nhớ không phải là vấn đề.
Nếu bạn không cần danh sách tuần tự tôi sẽ cố gắng sử dụng một Dictionary
như thế này:
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);
}
Bạn về cơ bản có một danh sách roomtypes khác nhau. Nhưng giải pháp này chỉ là OK nếu bạn không cần arraylist. Nhưng đối với các danh sách lớn, đây sẽ là danh sách nhanh nhất.
Tôi đã có giải pháp một lần với List<string>
với 300.000+ mục. So sánh từng phần tử với một danh sách có kích thước gần như giống nhau đã mất 12 giờ để làm. Đã thay đổi logic để sử dụng từ điển thay vì và giảm xuống còn 12 phút. Đối với các danh sách lớn hơn, tôi luôn luôn đi Dictionary<mytype, bool>
trong đó bool chỉ là một giả không được sử dụng.
ah xin lỗi của tôi đang chạy trên .net 2 không may – anonym0use
Với VS2008, điều này sẽ làm việc tốt với .NET 2. –
@OJ: với 2.0, chỉ khi bạn sử dụng LINQBridge ... Bất kỳ được cung cấp bởi .NET 3.5; bạn có thể sử dụng cú pháp Exists với C# 3.0 lambdas, tuy nhiên –