Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列表中的项目存在的时间有限_C# - Fatal编程技术网

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