Я хотел бы эффективно удалить дубликаты записей из очереди.
В очереди есть собственный класс с DateTime, FullPath и несколькими другими вещами
private Queue<MyCustomClass> SharedQueue;
DateTime в классе - это отметка времени при вставке в очередь. Я хотел бы использовать следующую логику: Удалить дубликаты из очереди, если FullPath идентичен в течение 4-секундного окна (то есть, если он добавлен в очередь в течение 4 секунд после дубликата полного пути). У меня есть события, которые я хочу посмотреть, но несколько дубликатов все равно появятся, и это нормально.
Я использую c # 2.0, класс FileSystemWatcher и рабочую очередь.
Есть несколько способов сделать это:
Обрезать очередь каждый раз, когда в нее добавляется элемент, или когда я работаю в очереди, пропустить обработку текущего дублированного элемента.
Или мне следует использовать глобальную частную переменную Dictionary ? Так я могу быстро найти его? или локальная копия очереди? Возможно, лучше всего ограничить локальную очередь до 100 элементов в случае большого количества файловых событий? Хотя в моем случае это «должно быть» только относительно небольшое количество файлов для мониторинга в папке ... но все всегда меняется ...
Спасибо за любую помощь.
: Изменить: 10 февраля 8:54 EST:
Поэтому я решил реализовать хорошее простое решение, насколько я могу судить.
Я не думаю, что слишком долго держусь за клавиши Dict ...
: Изменить: 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
}