首先,请承认我确实想要 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/