【发布时间】:2010-12-08 08:08:40
【问题描述】:
首先,请承认我确实想要Queue<T> 的功能——FIFO,通常只需要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>。
【问题讨论】:
-
PowerCollections (@codeplex) 可能对你有用