2010-02-14 172 views
1

我想在一定的时间内过滤来自流的传入的包。用FIFO过滤器

例如

过滤器的所有 “A” 5秒

10:00:00 "A" <- show 
10:00:01 "A" <- don't show 
10:00:02 "B" <- show 
10:00:03 "A" <- don't show 
10:00:06 "A" <- show 

中我想到了用一种FIFO的实现这一点。

您认为最好的解决方案是什么?

我使用C#.NET 3.5

回答

0

我不知道,我已经明白正确的问题,但未能你只存储为您遇到的第一个和每个时间在接下来的时间里,你将时间与那段时间进行比较?如果少于5秒过去了,不要显示它,如果更多,然后重置时间并显示A?

3

我没有看到FIFO的好处。以字典(“A”等)为键并存储忽略时间的字典(例如DateTime.Now.AddSeconds(5),或者如果由于计算机时间改变而害怕问题,请使用刻度)。每当你得到一个新的项目,检查你是否在字典中。如果是,比较过期时间;如果项目尚未到达,则忽略该项目。在所有其他情况下,请保留该项目,并将新的过期时间存储在字典中。

+0

噢,你打我吧。 :-) – 2010-02-15 00:07:12

+0

对不起,我下次再等几秒钟! ;) – Lucero 2010-02-15 00:20:57

+1

好主意,但让我们想象我的应用程序运行2周和每2秒我得到一个新的项目。我可以在什么时候清理字典? – Kai 2010-02-15 00:37:54

1

因此,您希望看到第一个“A”或“B”数据包,但在一段时间过后才会重复发送数据包?

您可以创建一个将类型(例如“A”)映射到DateTime或计时器刻度值的散列表。

对于您收到的每个数据包,请在散列表中查找其类型。

如果未找到,请将其与现在的时间(比如说)一起添加5秒。然后输出数据包。

如果您确实在散列表中找到它,请检查相关时间是否已经过去。

如果是这样,计算一个新的时间(从现在起五秒钟),替换旧的时间,并输出数据包。

如果不是,请忽略(过滤)数据包。

+0

哇,好的。你能告诉我,在几行“伪”代码? – Kai 2010-02-15 20:57:51