列表中的项目在限定时间内存在

时间:2015-06-24 17:47:36

标签: c#

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

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);
            }
        }
    }
`

这似乎有效,但我无法在刻度线运行时编辑字典。 EXTRA NOTE 此列表现在是带

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

3 个答案:

答案 0 :(得分:0)

这是两部分答案。对于一个你需要添加时间。因此,在名为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只是增加的时间。请注意元组是不可变的。一般来说,我喜欢它,因为任何类型都可以这种方式使用,甚至是原语。

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

答案 1 :(得分:0)

如果您足够了解类型参数,则可以创建一个扩展List<T>的类。使用您自己的方法隐藏Add()方法:
1.致电base.Add()
2.在一段时间后调用base.Remove()(理想情况下使用定时器。请参阅this thread

通过这种方式,您可以将工作抽象到应该执行工作的类(List),而不是让计时器执行。

编辑:如评论中所述,您可能还需要考虑并发/同步。 System.Collections.Concurrent中有一些集合,您可能需要考虑我认为是您正在制作的多线程应用程序。 (注意:虽然这个答案确实说你应该扩展List,但是永远不要试图在集合中使用并发性。让资源为你工作。)

答案 2 :(得分:0)

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