Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/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# 基于时间的字典/哈希表,具有128位键,即超时字典外的值_C#_.net_Events_Time_Temporal - Fatal编程技术网

C# 基于时间的字典/哈希表,具有128位键,即超时字典外的值

C# 基于时间的字典/哈希表,具有128位键,即超时字典外的值,c#,.net,events,time,temporal,C#,.net,Events,Time,Temporal,我需要制作一个基于时间的字典哈希表,它的大小不会无限增长 所谓“基于时间”,我的具体意思是,如果我要在时间X添加字典,我希望该项在X+Y时间不存在。Y是超时时间 我愿意将时间存储在字典中或作为键或值中的结构 背景: 我们正在使用的库调用了“回调”,它提供了4条信息(时间、键、值、操作类型) operationType可以是start或end(还有其他类型,但这并不重要) 因此,如果我在X之后的Y时间段内结束,我很乐意使用这些有用的信息。否则我可以放弃它 问题: 这基本上是一个计时器线程,它每隔Y

我需要制作一个基于时间的字典哈希表,它的大小不会无限增长

所谓“基于时间”,我的具体意思是,如果我要在时间X添加字典,我希望该项在X+Y时间不存在。Y是超时时间

我愿意将时间存储在字典中或作为键或值中的结构

背景:

我们正在使用的库调用了“回调”,它提供了4条信息(时间、键、值、操作类型)

operationType可以是start或end(还有其他类型,但这并不重要)

因此,如果我在X之后的Y时间段内结束,我很乐意使用这些有用的信息。否则我可以放弃它

问题:

这基本上是一个计时器线程,它每隔Y个间隔清理一次字典,并且主线程不断从回调向字典添加内容吗

我使用Dictionary来实现这一点,没有计时器,它似乎无限增长,即使我删除了我能够“加入”的元素


另外,是否有某种.NET库可以执行类似的操作?

您可以通过使用优先级队列(或只是一个最小堆)和关联的字典来避免定期扫描整个集合。不幸的是,.NET Framework不包括优先级队列集合,但有一些可用的。我不久前出版了一本书

这里的想法是,当您添加一个项时,您将它添加到字典和堆中。如果您想按项的键查找项,可以在字典中查找。如果要从堆中删除第一个项,可以从堆中获取它,并使用键(数据的一部分)将其从字典中删除

其美妙之处在于,您不必扫描整个字典来确定需要删除哪些字典,而可以查看堆的顶部:

while (heap.Count > 0 && heap.Peek().ExpirationTime < time)
{
    var item = heap.RemoveRoot();
    dictionary.Remove(item.Key);
}
while(heap.Count>0&&heap.Peek().ExpirationTime

这种方法的主要缺点是占用更多的内存,因为您有字典条目的开销。

另外,考虑到我可以分配任意多的空间(一次),即数组。我的密钥是128位,有没有办法在数组上生成一个哈希表,这样密钥就不会发生冲突?有人有这样一个散列函数的指针吗?你看过.NET缓存类吗?我将以ASP.NET缓存作为起点。我知道你是在一个类库里做这件事的,但是看看其他人是怎么做的,可能会给你一些想法。啊,好的。让我添加由回调指定的时间,它本身不是物理时间。也就是说,可以在间隔10分钟后调用回调。所以我需要字典读取时间字段。有关键的更多信息。它们是连续的吗?为什么是128位?“优先级队列(或只是一个最小堆)”这没有多大意义,最小堆是优先级队列的一种可能实现。@svick:这是一种看待它的方式。我倾向于认为堆是一种更通用的数据结构。