проверьте на дубликаты в arraylist

Каждый раз, когда вы вызываете 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
5
задан Bill the Lizard 1 November 2011 в 17:30
поделиться

6 ответов

Я не использовал бы 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>)

10
ответ дан 13 December 2019 в 05:44
поделиться

От Вашего вопроса мне не на 100% ясно, если Вы хотите осуществить правило, что может быть только одна комната данного типа, или если Вы просто хотите знать.

Если у Вас есть инвариант что никакой набор Rooms может иметь больше чем одно из того же 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);
}
1
ответ дан 13 December 2019 в 05:44
поделиться

Не используя лямбда-выражения:

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
ответ дан 13 December 2019 в 05:44
поделиться

Я думал с помощью списков, и выполнение Существует, где операция, которая берет 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 является просто макетом не быть используемым.

0
ответ дан 13 December 2019 в 05:44
поделиться
if (!rooms.Any (r => r.RoomType == typeToFind /*kitchen, ...*/))
  //add it or whatever
1
ответ дан 13 December 2019 в 05:44
поделиться

Иначе должен отсортировать массив, затем обойти элементы, пока Вы не находите пару смежных дубликатов. Доберитесь до конца, и массив без простофиль.

0
ответ дан 13 December 2019 в 05:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: