我想以有效的方式从队列中删除重复的条目。 队列与DateTime和FULLPATH和其他一些东西如何在一个时间范围内从队列中删除重复项目?
private Queue<MyCustomClass> SharedQueue;
自定义类的日期时间在班上是时间戳,当插入到队列中。我想要使用的逻辑如下:如果FullPath在4秒钟内完全相同(即,如果在重复的完整路径的4秒内添加到队列中),则从队列中删除重复项。我有我想要观看的事件,但有一些重复的内容仍然会到达,这没关系。
我正在使用c#2.0和FileSystemWatcher类和一个工作队列。
有很多种方法可以做到这一点: 每次向其中添加项目时或者当我在队列上工作时,修剪队列跳过处理当前的重复项目。
或者我应该使用“全球私人”变量字典<字符串,日期时间>?所以我可以快速搜索它?或队列的本地副本?在许多文件事件的情况下,最好将本地队列限制为100个项目?虽然在我的情况下,它“应该是”只有相对较少的文件来监视的文件夹中...但事情总是变化......
感谢您的帮助。
:编辑:2月10日美国东部时间八点54: 所以我决定,据我可以告诉落实好简单的解决方案。 我不认为我坚持的字典键太长...
:编辑:2月10日9:53美国东部时间:更新为我的字典不能包含重复的值。
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
}
为什么选择'全球私人'字典?为什么不把它放在与你的队列相同的范围? – recursive 2011-02-09 16:47:55
这实际上是它在哪里。我的错。 – user610064 2011-02-09 17:29:41
谢谢@StevenJeuris在Enqueue之前检查我的想法 - 我忘记了我在那里做了那个例程。我不想进入重写或扩展类... – user610064 2011-02-10 14:08:34