C# 如何确定队列是否在另一个位置包含最后一项?

C# 如何确定队列是否在另一个位置包含最后一项?,c#,collections,C#,Collections,让我们有一个队列和一个最后排队的项目。找出项目是否(不)在队列中其他位置的最有效方法是什么 如果有帮助的话,可以将项目存储到另一个变量中。只需保留一个哈希集字典并以这种方式保留项目的计数-当您将项目排入队列时,您可以增加该项目的计数(如果尚未出现,则将其添加到字典中)-您可以使用字典.ContainsKey()进行检查在添加新项之前,查看该项是否已添加,或检索该项的计数(在本例中,插入后大于等于2)-这当然需要正确定义该项的相等性 同样,当您将项目从队列中出列时,必须减少字典中的项目计数,并在计

让我们有一个队列和一个最后排队的项目。找出项目是否(不)在队列中其他位置的最有效方法是什么

如果有帮助的话,可以将项目存储到另一个变量中。

只需保留一个
哈希集
字典
并以这种方式保留项目的计数-当您将项目排入队列时,您可以增加该项目的计数(如果尚未出现,则将其添加到字典中)-您可以使用
字典.ContainsKey()进行检查
在添加新项之前,查看该项是否已添加,或检索该项的计数(在本例中,插入后大于等于2)-这当然需要正确定义该项的相等性

同样,当您将项目从队列中出列时,必须减少字典中的项目计数,并在计数达到零时将其删除

这种方法以额外的内存成本换取O(1)查找时间。

只需保留一个
哈希集
字典,并以这种方式保留项目的计数-当您将项目排入队列时,您会增加该项目的计数(如果尚未出现,则将其添加到字典中)-您可以在添加新项之前使用
dictionary.ContainsKey()
检查该项是否已添加,或者检索该项的计数(在本例中插入后为>=2)-这当然需要正确定义该项的相等性

同样,当您将项目从队列中出列时,必须减少字典中的项目计数,并在计数达到零时将其删除


这种方法用额外的内存消耗换取O(1)查找时间。

我终于找到了它!我希望它也能帮助其他人

此任务的更好集合是
LinkedList

bool findNotLast<T>(T item, LinkedList<T> list) {
    return list.Count>1 && list.Find(item) != list.Last;
}
bool findNotLast(T项,链接列表){
返回列表.Count>1&&list.Find(item)!=list.Last;
}

我终于找到了!我希望它也能帮助其他人

此任务的更好集合是
LinkedList

bool findNotLast<T>(T item, LinkedList<T> list) {
    return list.Count>1 && list.Find(item) != list.Last;
}
bool findNotLast(T项,链接列表){
返回列表.Count>1&&list.Find(item)!=list.Last;
}


@James Michael Hare:计算时间越短,内存越少越好。@JanTuroň不幸的是,在大多数情况下,这是两个相反的目标;)@ReedCopsey:同意,这就是为什么我总是问“高效”的标准是什么…@JanTuroň:快速提问-你说的“最后一个”是指队列的尾部(你排队()到的地方)还是队列的头部(你排队()到的地方)@JanTuroň还有-你真的需要队列(FIFO)吗?如果订单不重要,会有更好的选择。。。(我假设排序很重要,但只是以防万一。)@James Michael Hare:计算时间越短,内存越少。@JanTuroň不幸的是,在大多数情况下,这两个目标是相反的;)@ReedCopsey:同意,这就是为什么我总是问“高效”的标准是什么…@JanTuroň:快速提问-你说的“最后一个”是指队列的尾部(你排队()到的地方)还是队列的头部(你排队()到的地方)@JanTuroň还有-你真的需要队列(FIFO)吗?如果订单不重要,会有更好的选择。。。(我假设顺序很重要,但只是问以防万一。)+1与我的答案基本相同。不过你赢了我。啊,是的,一本用于计数的
字典将更适合这种情况,因为你必须计数才能跟踪重复项。在这一点上,查找时间必须是值得的,
O(1)
involved@BrokenGlass:这个主意不错,但是有很多额外的代码。我喜欢写代码,第一眼就能看清楚它的功能。在这里,编码人员被迫思考“额外的收集是为了什么?”是的,这是非常正确的-你平均有多少项在这个队列中也许以线性方式浏览队列中的项目“足够好了”,我估计平均100个,最多500个,每秒上排/下排10次,应用程序中有1-6个队列(Snake)。在这一点上,任何聪明的想法都可能对应用程序至关重要。+1与我的答案基本相同。不过你赢了我。啊,是的,一本用于计数的
字典将更适合这种情况,因为你必须计数才能跟踪重复项。在这一点上,查找时间必须是值得的,
O(1)
involved@BrokenGlass:这个主意不错,但是有很多额外的代码。我喜欢写代码,第一眼就能看清楚它的功能。在这里,编码人员被迫思考“额外的收集是为了什么?”是的,这是非常正确的-你平均有多少项在这个队列中也许以线性方式浏览队列中的项目“足够好了”,我估计平均100个,最多500个,每秒上排/下排10次,应用程序中有1-6个队列(Snake)。在这一点上,任何明智的想法都可能对应用程序至关重要。