列表中的项目存在的时间有限

本文关键字:时间 项目 列表 存在 | 更新日期: 2023-09-27 17:59:35

我想要一个在指定时间内保存项目的列表
这就是我现在尝试的:

private void digtimer_Tick(object sender, EventArgs e) //Goes off every half a second
{
    justmine.Clear();
}

但是,无论列表中的项目存在多长时间,这种方式都会在每个间隔后删除所有项目。是否有任何方法可以在列表项存在指定时间后将其删除?

编辑:列表仅为整数。最新的代码是:

` //public static Dictionary<int, DateTime> justmine = new Dictionary<int, DateTime>();
//Adding an item is: justmine.Add(userid, DateTime.Now);
private void digtimer_Tick(object sender, EventArgs e)
    {
        foreach (KeyValuePair<int, DateTime> pair in justmine)
        {
            console.Items.Add((DateTime.Now - pair.Value).TotalSeconds).ToString();
                string x = ((DateTime.Now - pair.Value).TotalSeconds).ToString();
            if ((Convert.ToDouble(x) < 500.0))
            {
                justmine.Remove(pair.Key);
            }
        }
    }
`

这似乎是可行的,但我不能在滴答作响的时候编辑词典额外注释此列表现在是带有的词典

public static Dictionary<int, DateTime> justmine = new Dictionary<int, DateTime>();

列表中的项目存在的时间有限

    public class JustMine
{
    public string Value { get; set; }
    public decimal Milliseconds { get; set; }
    public JustMine()
    {
        this.Milliseconds = DateTime.Now.Ticks / (decimal)TimeSpan.TicksPerMillisecond;
    }
}
        List<JustMine> JustMine = new List<JustMine>();
        var now = DateTime.Now.Ticks / (decimal)TimeSpan.TicksPerMillisecond;
        var limit = 5000; // 5 seconds
        foreach(var item in JustMine.ToList())
        {
            if (now - item.Milliseconds >= limit)
            {
                JustMine.Remove(item);
            }
        }

这是一个由两部分组成的答案。首先,你需要增加时间。因此,在您的类型中添加一个名为Added的DateTime。现在,当你把一个项目添加到你需要做的列表中时;

myInstance.Added = DateTime.UtcNow;
justmine.Add(myInstance);

在您的digtimer_Tick方法中,将Added值与DateTime.UtcNow类似;

 if ((DateTime.UtcNow - item.Added).TotalSeconds > lifeTime) {
    justmine.Remove(item);
 }

请注意,比我建议修改您的类型更好的可能是建议使用Tuple<DatTime, YouType>,其中item1只是添加的时间。请注意,元组是不可变的。总的来说,我喜欢它,因为任何类型都可以这样使用,即使是基元。

第二个注释;在digitalimer_Tick中,您可能会像justmine.Where(x => (DateTime.UtcNow - x.Added).TotalSeconds > lifeTime)一样,然后从原始集合中删除该集合,而不是使用foreach循环。

如果您足够了解类型参数,您可以创建一个扩展List<T>的类。使用您自己的方法隐藏Add()方法以:
1.致电base.Add()
2.在一定时间后调用base.Remove()(最好使用计时器。请参阅此线程)

通过这种方式,您可以将工作抽象为应该进行工作的类(List),而不是由计时器来完成

编辑:正如评论中提到的,您可能还需要考虑并发/同步。System.Collections.Concurrent中有一些Collections,您可能需要考虑,我认为它是您正在制作的多线程应用程序。(注意:虽然这个答案确实说你应该扩展List,但千万不要试图在Collections中使用并发来滚动你自己的。让资源为你做这件事。)