Каждый раз, когда вы вызываете timediff, Psos сбрасывается на пустое ... Не уверен, зачем нужна коллекция, просто создайте глобальную переменную Date и сравните с ней, или сделайте все за одну процедуру:
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
Public Sub OneMinuteLoop()
Dim dtmNow As Date
Dim dtmLastUpdate As Date
Do While True
dtmNow = Now()
If DateDiff("s", dtmLastUpdate, dtmNow) > 30 Then
'Do something
dtmLastUpdate = dtmNow
End If
Sleep 5000
DoEvents
Loop
End Sub
Я не использовал бы 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>
)
От Вашего вопроса мне не на 100% ясно, если Вы хотите осуществить правило, что может быть только одна комната данного типа, или если Вы просто хотите знать.
Если у Вас есть инвариант что никакой набор Room
s может иметь больше чем одно из того же Room
введите, Вы могли бы попытаться использовать a Dictionary<Type, Room>
.
Это обладает преимуществом не выполнения линейного поиска на, добавляют.
Вы добавили бы комнату с помощью следующих операций:
if(rooms.ContainsKey(room.GetType()))
{
// Can't add a second room of the same type
...
}
else
{
rooms.Add(room.GetType(), room);
}
Не используя лямбда-выражения:
void AddRoom(Room r, IList<Room> rooms, IDictionary<string, bool> roomTypes)
{
if (!roomTypes.Contains(r.RoomType))
{
rooms.Add(r);
roomTypes.Add(r.RoomType, true);
}
}
На самом деле не имеет значения, каков тип значения в словаре, потому что единственной вещью, на которую Вы когда-либо смотрите, являются ключи.
Я думал с помощью списков, и выполнение Существует, где операция, которая берет O(n)
время. Используя Dictionary
вместо этого O(1)
и предпочтен, если память не является проблемой.
Если бы Вам не нужен последовательный Список, я попытался бы использовать a 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. Но это решение только в порядке, если Вам не нужен arraylist. Но для больших списков это будет самым быстрым.
У меня было решение однажды с List<string>
с 300 000 + объекты. Сравнение каждого элемента с другим списком почти того же размера заняло огромные 12 часов, чтобы сделать. Переключенный логика на использование Словаря вместо этого и вниз на 12 минут. Для больших списков я всегда иду Dictionary<mytype, bool>
где bool является просто макетом не быть используемым.
if (!rooms.Any (r => r.RoomType == typeToFind /*kitchen, ...*/))
//add it or whatever
Иначе должен отсортировать массив, затем обойти элементы, пока Вы не находите пару смежных дубликатов. Доберитесь до конца, и массив без простофиль.