キューから重複するエントリを効率的に削除したいと思います。キューには、DateTimeとFullPathおよびその他のいくつかのカスタムクラスがあります
private Queue<MyCustomClass> SharedQueue;
クラスのDateTimeは、キューに挿入されたときのタイムスタンプです。使用したいロジックは次のとおりです。FullPathが4秒のウィンドウ内で同一である場合(つまり、重複するフルパスから4秒以内にキューに追加された場合)、キューから重複を削除します。見たいイベントがありますが、まだいくつかの複製が届きますので、問題ありません。
私はc#2.0とFileSystemWatcherクラスとワーカーキューを使用しています。
これを行うには、さまざまな方法があります。アイテムが追加されるたびにキューをトリミングするか、キューで作業しているときに、現在の重複アイテムの処理をスキップします。
または、「グローバルプライベート」変数Dictionary <String、DateTime>を使用する必要がありますか?だから私はすぐにそれを検索できますか?またはキューのローカルコピー?多くのファイルイベントが発生する場合は、ローカルキューを100アイテムに制限するのが最善でしょうか。私の場合、フォルダ内で監視するファイルは比較的少ないはずですが...しかし、状況は常に変化します...
助けてくれてありがとう。
:編集:2月10日8:54 EST:それで、私が知る限り、良い単純なソリューションを実装することにしました。Dictキーを長く保持しすぎているとは思いません...
:編集:2月10日9:53 EST:辞書に重複する値を含めることができないため更新されました。
public void QueueInput(HotSynchUnit.RcdFSWFile rcd)
// start the worker thread when program starts.
// call Terminate.Set() in the programs exit routine or close handler etc.
{
// lock shared queue
lock (SharedQueue)
{
if (!IsDuplicateQueueInput(rcd)) // only add unique values to queue
{
SharedQueue.Enqueue(rcd);
SomethingToDo.Set();
}
}
} // public void QueueInput
private bool IsDuplicateQueueInput(HotSynchUnit.RcdFSWFile rcd)
/* Return true if the object is a duplicate object.
* Pseudo Code:
*
* isDuplicate = false
* Lock Dictionary
* -If lastTimeStamp > 4 seconds ago then // Optimization: save lastTimeStamp
* if Dict.Count > 0 then clear Dictionary
* return isDuplicate
* -If not Dict.TryGetValue(sPath, dtTimeStamp) then
* Dict.AddKey()
* -Else
* Compare key timestamp to Currenttime
* if key timestamp is <= 4 seconds ago then
* IsDuplicate = True
*
* Dict.RemoveKey()
* Dict.AddKey()
*
* return isDuplicate
*/
{
// put real code here
}