c# - 有没有更好的方法来为队列实现 Remove 方法?

标签 c# .net queue

首先,请承认我确实想要 Queue<T> 的功能-- 先进先出,一般只需要Enqueue/Dequeue等等——所以我更喜欢一个答案,而不是“你真正想要的是 List<T>”(我知道 RemoveAt)。

例如,假设我有一个 Queue<DataPoint> dataToProcess需要按到达顺序处理的数据点。然后定期有一些这样的代码是有意义的:

while (dataToProcess.Count > 0) {
    DataPoint pointToProcess = dataToProcess.Dequeue();
    ProcessDataPoint(pointToProcess);
}

然后假设,无论出于何种原因,发现已添加到队列中的特定数据点不应被处理。如果有一种类似于以下的方法,那将是理想的:

dataToProcess.Remove(badPoint);

我知道确实没有可行的方法来获得 Remove不涉及某种形式的枚举的方法;但是,由于 Queue<T>并不是真的让你随便走进去拿走一些东西,我能想到的唯一解决办法是:

bool Remove(T item) {
    bool itemFound = false;

    // set up a temporary queue to take items out
    // one by one
    Queue<T> receivingQueue = new Queue<T>();

    // move all non-matching items out into the
    // temporary queue
    while (this.Count > 0) {
        T next = this.Dequeue();
        if (next.Equals(item)) {
            itemFound = true;
        } else {
            receivingQueue.Enqueue(next);
        }
    }

    // return the items back into the original
    // queue
    while (receivingQueue.Count > 0) {
        this.Enqueue(receivingQueue.Dequeue());
    }

    return itemFound;
}

这很荒谬吗?它肯定看起来很糟糕,但除了编写自定义类之外,我真的找不到更好的方法。即便如此,我能想到的实现 Remove 的最佳方式方法是使用 LinkedList<T>内部。

最佳答案

我认为切换到内部具有 LinkedList 的新自定义类只会花费您几分钟,而且会比您现在拥有的更高效。

public class SpecialQueue<T>
{
    LinkedList<T> list = new LinkedList<T>();

    public void Enqueue(T t)
    {
        list.AddLast(t);
    }

    public T Dequeue()
    {
        var result = list.First.Value;
        list.RemoveFirst();
        return result;
    }

    public T Peek()
    {
        return list.First.Value;
    }

    public bool Remove(T t)
    {
        return list.Remove(t);
    }

            public int Count { get { return list.Count; } }
}

关于c# - 有没有更好的方法来为队列实现 Remove 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1594375/

相关文章:

java - 使用队列中的对象中的方法,Java

c++ - 整数环绕?

iOS DispatchQueue.main.asyncAfter(截止日期 : delayTime) never dispatch if delayTime is long

c# - 简单注入(inject)器注册自动映射器

c# - 文本 block 不会更新

.net - 有没有GAC管理工具?

c# - 将基类型转换/转换为派生类型

c# - .Net 文件流 - 句柄与路径

c# - 共享资源字典 : edit resource in Blend

c# - 我如何获得完成在其属性值中建立的要求的所有类属性?