获取具有计时器成员的类项目列表中项目的索引

Posted

技术标签:

【中文标题】获取具有计时器成员的类项目列表中项目的索引【英文标题】:Get Index of an Item in a List of Class Items with Timer Member 【发布时间】:2017-12-12 09:22:58 【问题描述】:

我正在尝试查找触发计时器的索引。

我在 Program.cs 中创建了一个 Class Entry 列表

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());

列表将如下所示

列表索引 |条目

0 |包| pkt定时器

1 |包| pkt定时器

2 |包| pkt定时器

3 |包| pkt定时器

4 |包| pkt定时器

【问题讨论】:

idleTimeOutTimer 在哪里定义?您的代码只定义了PktTimer 我的错误。 idleTimeOutTimer 是 pktTimer。我只是在了解这里的代码时交换了名称。谢谢你通知我。 【参考方案1】:

您非常接近 IndexOf 需要您尝试获取索引的项目。在这种情况下,您尝试获取其索引的 Entry 类。我相信在你的情况下,这将是关键词,所以 IndexOf(this)。

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

【讨论】:

出于测试目的,我已将计时器时间减少到 1 秒。并在将条目项添加到列表后。 1 秒后,它调用 CallDeleteEntry 并引发错误。错误是 System.ArgumentOutOfRangeException:'索引超出范围。必须是非负数且小于集合的大小。我调试了它,pktIndex 是-1。有什么想法吗?【参考方案2】:

@Jason Mastnick

是什么导致我在我的 cmets 中向您提到的上述错误是

            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 处的第一项不会被删除。有什么想法吗?

【讨论】:

以上是关于获取具有计时器成员的类项目列表中项目的索引的主要内容,如果未能解决你的问题,请参考以下文章

获取数组列表中项目的索引;

Flutter BLoC:在父 Widget 更新时维护子状态

在选中列表框中获取具有值的索引

选择 ListView 项目时触发计时器

AndroidStudio项目制作倒计时模块

JS vs DOM 计时:.remove() 元素在视觉上发生,但遍历仍然包含它