2010-02-14 170 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