在C#中,是否有一个队列只能在其生命周期内保存一次对象?

Rum*_* P. 5 c# queue data-structures

我需要一个数据结构,这是一种特殊类型的队列.我想要的是,如果我的队列的一个实例曾经包含一个对象X,那么在这个实例中不应该再次将X排队.如果使用X调用,则排队方法应该不执行任何操作,例如尝试向HashSet添加重复值.

用法示例:

MyQueue<int> queue = new MyQueue<int>(); 
queue.Enqueue(5); 
queue.Enqueue(17); 
queue.Enqueue(28); 
queue.Enqueue(17); 
int firstNumber = queue.Dequeue(); 
queue.Enqueue(5); 
queue.Enqueue(3); 

List<int> queueContents = queue.ToList(); //this list should contain {17, 28, 3}
Run Code Online (Sandbox Code Playgroud)

我在MSDN上环顾四周,但找不到这样的课程.它存在,还是我必须自己实现?

我想我也可以使用不同的数据结构,但访问将始终是FIFO,所以我认为队列将是最有效的.此外,我不知道任何其他结构提供这种"实例生命周期的唯一性"功能.

Duk*_*ing 5

你必须自己实现它.

一个想法就是HashSet在排队时将元素添加到a中.

然后,当你想要入队时,只需检查HashSet项目是否存在,不要入队.

由于您希望防止队列生命周期的其余部分入队,因此您可能不希望从中删除HashSet.


小智 5

我会做类似的事情:

class UniqueQueue<T>
{
    private readonly Queue<T> queue = new Queue<T>();
    private HashSet<T> alreadyAdded = new HashSet<T>();

    public virtual void Enqueue(T item)
    {
        if (alreadyAdded.Add(item)) { queue.Enqueue(item); }
    }
    public int Count { get { return queue.Count; } }

    public virtual T Dequeue()
    {
        T item = queue.Dequeue();
        return item;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,此代码的大部分内容都来自This Thread.

  • `Dequeue` 应该从 `alreadyAdded` 中清除出队的项目,否则对 `Enqueue` 的后续调用将不起作用。 (2认同)