仅当队列中不存在项目时才将其添加到队列中

时间:2016-01-21 10:11:30

标签: c#

我正在使用队列处理zip文件。因此,只要新的zip文件到达指定的路径,就会使用
将file_info添加到队列中 fileQueue.Enqueue(IFile); 现在我应该将文件添加到队列中,如果它不存在。我尝试实现IEqualityComparer<T>接口和

public bool Equals(T x, T y)
{
   object xValue = _propertyInfo.GetValue(x, null);
   object yValue = _propertyInfo.GetValue(y, null);
   return xValue.Equals(yValue);
} 

public int GetHashCode(T obj)
{
   object propertyValue = _propertyInfo.GetValue(obj, null);
   if (propertyValue == null)
      return 0;
   else
      return propertyValue.GetHashCode();
} 

我有一个获取fileInfo的接口

public interface IFile
{        
   string FilePath { get; set; }
}

另一个队列对象

public Queue<IFile> fileQueue = new Queue<IFile>();

任何人都可以建议在再次将其添加到队列之前检查文件是否已存在于队列中。 非常感谢你。

2 个答案:

答案 0 :(得分:3)

如果你想要一个快速执行的解决方案(并希望每次添加smth时都避免遍历整个队列)你需要实现自己的队列。

像这样

public class MyQueue
{
    private Queue<IFile> _queue;
    private HashSet<int> hashes;

    public void Add(IFile file)
    {
        var hash = GetHash(file);
        if (hashes.Add(hash))
        {
            _queue.Enqueue(file);
        }
    }
}

基本上有一个&#34;目录&#34; - 实现为哈希集(用于保存唯一值列表)

注意:一旦开始使用队列,消息 - 这种架构背后的整个想法 - 消息应该是idempotent。这意味着 - 它并不重要你多次向队列添加相同的消息。

答案 1 :(得分:1)

if(!fileQueue.Any(x => x.FilePath == file.FilePath))
   fileQueue.Enqueue(file)