我想要一个能够在指定时间内保存项目的列表。
这就是我现在尝试的:
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>();
答案 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);
}
}