Получить индекс элемента в списке элементов класса с элементом таймера

Я пытаюсь найти индекс сработавшего таймера.

Я создал список записи класса здесь в Program.cs

static public List<Entry> Table = new List<Entry>();

Это класс "Entry" с его конструкторами в Entry.cs

public class Entry
    {
        public int pktID;

        public Timer pktTimer= new Timer();
    }


public Entry()
      {
      }




public Entry(int _pktID, Boolean idleTimeOutStart)
        {
            this.pktID = _pktID;

            if (idleTimeOutStart == true)
            {
                pktTimer.Elapsed += (sender, e) => CallDeleteEntry(sender, e, Program.Table.IndexOf());

                pktTimer.Interval = 10000; // 10000 ms is 10 seconds
                pktTimer.Start();

            }


        }

static void CallDeleteEntry(object sender, System.Timers.ElapsedEventArgs e, int pktIndex)
        {
            Program.Table.RemoveAt(pktIndex); //Removes Entry at this Index
            Program.Table[pktIndex].idleTimeOutTimer.Stop(); //Stops idleTimeOutTimer of This Entry
        }

Элементы в списке создаются случайным образом. Теперь запускается каждый таймер в списке (индекс списка), а затем через 10000 мсек вызывается CallDeleteEntry.

Что мне нужно сделать, это передать индекс таймера, когда он проходит 10000 мс, в CallDeleteEntry, чтобы он мог удалить эту строку элемента для списка.

Я думаю, что-то должно быть изменено здесь, чтобы это работало.

idleTimeOutTimer.Elapsed += (sender, e) => CallDeleteEntry(sender, e, Program.Table.IndexOf());

Список будет выглядеть так

ListIndex | Элемент входа

0 | ПКТ | pktTimer

1 | ПКТ | pktTimer

2 | ПКТ | pktTimer

3 | ПКТ | pktTimer

4 | ПКТ | pktTimer

2 ответа

Решение

Ваш довольно близкий IndexOf требует элемент, индекс которого вы пытаетесь получить. в этом случае класс Entry, для которого вы пытаетесь получить индекс. Я считаю, что в вашем случае это будет ключевым словом this, поэтому IndexOf (this).

https://msdn.microsoft.com/en-us/library/8bd0tetb(v=vs.110).aspx

@ Джейсон Мастник

Что вызвало вышеуказанную ошибку, о которой я упоминал в комментариях к вам, было

            Program.Table.RemoveAt(pktIndex); //Removes Entry at this Index
            Program.Table[pktIndex].idleTimeOutTimer.Stop(); //Stops idleTimeOutTimer of This Entry

Я должен сначала остановить таймер, а затем удалить пакет

            Program.Table[pktIndex].idleTimeOutTimer.Stop(); //Stops idleTimeOutTimer of This Entry
            Program.Table.RemoveAt(pktIndex); //Removes Entry at this Index

Кстати, ваше решение работает. Я должен написать это так.

pktTimer.Elapsed += (sender, e) => CallDeleteEntry(sender, e, Program.Table.IndexOf(this));

Однако возникает проблема. Я пытался последовательно добавлять записи в список. Первый пройденный pktIndex - "1", а не "0". Поскольку первый элемент добавлен в индекс 0. Он должен быть первым, который будет удален в этом последовательном сценарии. Все работает хорошо, ожидайте, что этот первый элемент в индексе 0 не будет удален. Есть идеи?

Другие вопросы по тегам