C# 列表中的项目存在的时间有限
我想要一个列表,可以在指定的时间内保存一个项目C# 列表中的项目存在的时间有限,c#,C#,我想要一个列表,可以在指定的时间内保存一个项目 这就是我现在尝试的: private void digtimer_Tick(object sender, EventArgs e) //Goes off every half a second { justmine.Clear(); } 但是,这种方式会在每个间隔后删除所有项目,而不管列表中的项目存在多长时间。是否有任何方法可以在列表项存在指定时间后将其删除 编辑:列表仅为整数。最新代码是: ` //public static Dicti
这就是我现在尝试的:
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 justmine=new Dictionary();
//添加的项目是:justmine.Add(userid,DateTime.Now);
私有void digtimer_Tick(对象发送方,事件参数e)
{
foreach(justmine中的KeyValuePair对)
{
console.Items.Add((DateTime.Now-pair.Value).TotalSeconds.ToString();
字符串x=((DateTime.Now-pair.Value).TotalSeconds.ToString();
如果((转换为双(x)<500.0))
{
justmine.Remove(配对键);
}
}
}
`
这似乎是可行的,但我无法在滴答声运行时编辑词典额外注释此列表现在是一本带有
public static Dictionary<int, DateTime> justmine = new Dictionary<int, DateTime>();
publicstaticdictionary justmine=newdictionary();
这是一个由两部分组成的答案。首先,你需要增加时间。因此,在类型中添加一个名为Added
的日期时间。现在,当您向列表中添加一项时,您需要执行以下操作:
myInstance.Added = DateTime.UtcNow;
justmine.Add(myInstance);
在digtimer_Tick方法中,将附加值与DateTime.UtcNow like进行比较
if ((DateTime.UtcNow - item.Added).TotalSeconds > lifeTime) {
justmine.Remove(item);
}
注意,比我建议修改您的类型更好的可能是建议使用Tuple
,其中item1
只是添加的时间。请注意元组是不可变的。一般来说,我喜欢它,因为任何类型都可以这样使用,即使是原语
第二个说明;在digitimer_Tick中,您可能会像
justmine.Where(x=>(DateTime.UtcNow-x.Added).TotalSeconds>life)
那样,然后从原始集合中删除该集合,而不是使用foreach循环。如果您对类型参数理解得足够透彻,您可以创建一个扩展列表的类。使用自己的方法将Add()
方法隐藏到:
1.调用base.Add()
2.在特定时间后调用base.Remove()
(最好使用计时器。请参阅)
通过这种方式,您可以将工作抽象到应该执行工作的类(List
),而不是让计时器来执行
<>编辑:正如注释中提到的,您可能还需要考虑并发/同步。在 Stuty.Stuty.并发中有一些集合,您可能需要考虑我假设的是一个多线程应用程序。(注意:虽然这个答案确实说您应该扩展列表,但千万不要尝试在集合中使用并发来滚动您自己的。让资源来为您工作。)公共类JustMine
{
公共字符串值{get;set;}
公共十进制毫秒数{get;set;}
公共卫生服务()
{
this.millides=DateTime.Now.Ticks/(十进制)TimeSpan.TicksPerMillisecond;
}
}
List JustMine=新列表();
var now=DateTime.now.Ticks/(十进制)TimeSpan.tick毫秒;
var限制=5000;//5秒
foreach(JustMine.ToList()中的变量项)
{
如果(现在-项毫秒>=限制)
{
移除(项目);
}
}
您可以将项目存储为元组,然后只允许访问尚未“过期”的项目(换句话说,您不必从列表中删除项目)。而真正删除项目的一个潜在问题是,如果您对列表执行foreach
,并且项目被删除,会发生什么?(答:没有什么好事情发生)在你做foreach之前,你应该复制列表,并在副本中重复。我个人不希望记录添加的时间,我更喜欢它到期的时间。那样的话,它只是一个expires@Lloyd 6的问题,另一个是半打,但我确实喜欢在物品上有expires
属性的想法。不过,这多少取决于您的型号。对于许多数据模型/存储,您已经有了最后一次写入时间,这就是我选择它的原因。@Mephy这个问题的上下文大不相同。它询问扩展列表的逻辑。在这种情况下,这是有意义的,因为OP需要一个行为方式稍有不同的列表,而不是完全不同的数据结构(这是链接线程中询问的)。List.Add和List.Remove不是虚拟的,因此不能重写它们。查看我的错误,隐藏,而不是重写。对此代码所做的一些解释将对OP非常有帮助。盲目复制代码从来都不是好的,没有解释的答案会鼓励这样做。将所有列表值封装到viewmodel中,并将其与创建值时的当前时间戳耦合。您的列表值现在成为一个类型为JustMine的列表。在digtimer_tick函数中,您循环浏览JustMine列表并删除x秒前输入的任何值。
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);
}
}