- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我问之前,让我得到一个明显的答案:ICollection<T>
接口(interface)包括一个Remove
删除任意元素的方法,其中 Queue<T>
和 Stack<T>
不能真正支持(因为他们只能删除“结束”元素)。
好的,我意识到这一点。实际上,我的问题并不是专门针对 Queue<T>
或 Stack<T>
集合类型;而是关于不实现 ICollection<T>
的设计决策对于本质上是 T
集合的任何泛型类型值(value)观。
这就是我觉得奇怪的地方。假设我有一个方法可以接受 T
的任意集合,并且出于我正在编写的代码的目的,了解集合的大小会很有用。例如(以下代码很简单,仅用于说明!):
// Argument validation omitted for brevity.
static IEnumerable<T> FirstHalf<T>(this ICollection<T> source)
{
int i = 0;
foreach (T item in source)
{
yield return item;
if ((++i) >= (source.Count / 2))
{
break;
}
}
}
Queue<T>
上运行。或
Stack<T>
, 除了那些类型没有实现
ICollection<T>
.他们确实实现了
ICollection
,当然——我猜主要是为了
Count
单独的属性——但这会导致奇怪的优化代码,如下所示:
// OK, so to accommodate those bastard Queue<T> and Stack<T> types,
// we will just accept any IEnumerable<T>...
static IEnumerable<T> FirstHalf<T>(this IEnumerable<T> source)
{
int count = CountQuickly<T>(source);
/* ... */
}
// Then, assuming we've got a collection type with a Count property,
// we'll use that...
static int CountQuickly<T>(IEnumerable collection)
{
// Note: I realize this is basically what Enumerable.Count already does
// (minus the exception); I am just including it for clarity.
var genericColl = collection as ICollection<T>;
if (genericColl != null)
{
return genericColl.Count;
}
var nonGenericColl = collection as ICollection;
if (nonGenericColl != null)
{
return nonGenericColl.Count;
}
// ...or else we'll just throw an exception, since this collection
// can't be counted quickly.
throw new ArgumentException("Cannot count this collection quickly!");
}
ICollection
接口(interface)完整 (当然,我的意思不是放弃实现,因为那将是一个重大变化;我的意思是,停止使用它),然后简单地实现
ICollection<T>
为没有完美匹配的成员明确实现?
ICollection<T>
提供:
Count
-- Queue<T>
和 Stack<T>
都有这个。 IsReadOnly
-- Queue<T>
和 Stack<T>
很容易就有这个。 Add
-- Queue<T>
可以显式地实现这一点(使用 Enqueue
),Stack<T>
也可以(与 Push
)。 Clear
- 查看。 Contains
- 查看。 CopyTo
- 查看。 GetEnumerator
——检查(呃)。 Remove
-- 这是唯一的Queue<T>
和 Stack<T>
没有一个完美的匹配。 ICollection<T>.Remove
返回
bool
;所以
Queue<T>
的显式实现可以完全(例如)检查要删除的项目是否实际上是 head 元素(使用
Peek
),如果是,请调用
Dequeue
并返回
true
, 否则返回
false
.
Stack<T>
可以很容易地用
Peek
给出类似的实现和
Pop
.
Queue<T>
的设计者为什么没有和 Stack<T>
实现这个接口(interface)? 也就是说,是什么设计因素(我可能没有考虑)导致决定这将是错误的选择?为什么是
ICollection
改为实现?
List<T>
实现
IList
冲突)?队列/堆栈的概念与
ICollection<T>
的概念之间是否存在概念上的脱节?是为了代表?
Queue<T>
(例如)没有实现
ICollection<T>
,并且我不想只是盲目地设计自己的类型并以不适当的方式实现接口(interface),而没有了解并充分考虑我在做什么。
最佳答案
我不能给出“实际想法是什么”的答案——也许其中一位设计师会给我们真正的想法,我可以删除它。
但是,将自己置于“如果有人来找我做出这个决定怎么办”的心态,我可以想到一个答案..让我用这段代码来说明:
public void SomeMethod<T>( ICollection<T> collection, T valueA, T valueB)
{
collection.Add( valueA);
collection.Add( valueB);
if( someComplicatedCondition())
{
collection.Remove(valueA);
}
}
ICollection<T>
的错误实现,但我们希望框架能够树立榜样)。让我们假设您在问题中陈述的 Stack/Queue 实现。上面的代码也是如此,还是因为
ICollection<T>.Remove()
存在边缘情况错误?应该检查吗?如果
valueA
必须删除,如何解决此问题以同时使用堆栈和队列?有答案,但显然上面的代码在这种情况下是错误的——即使它闻起来很合理。
ICollection<T>
,记住删除的边缘情况!)
关于.net - 为什么 Queue(T) 和 Stack(T) 没有实现 ICollection(T)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4776218/
我试图弄清楚以下模块正在做什么。 import Queue import multiprocessing import threading class BufferedReadQueue(Queue.
如果我使用 Queue.Queue,那么我的 read() 函数不起作用,为什么?但是,如果我使用 multiprocessing.Queue,它运行良好: from multiprocessing
我正在寻找比我在文档中找到的更多关于 Python 队列实现的见解。 根据我的理解,如果我在这方面有误,请原谅我的无知: queue.Queue():通过内存中的基本数组实现,因此不能在多个进程之间共
当我使用多处理模块(Windows 上的 Python 2.7)中的队列代替 Queue.Queue 时,我的程序没有完全关闭。 最终,我想使用 multiprocessing.Process 处理
阅读了大量的 JavaScript 事件循环教程,我看到了不同的术语来标识队列存储消息,当调用堆栈为空时,事件循环准备好获取消息: 队列 消息队列 事件队列 我找不到规范的术语来识别它。 甚至 MDN
我收到错误消息“类型队列不接受参数”。当我将更改队列行替换为 PriorityQueue 时,此错误消失并且编译正常。有什么区别以及如何将其更改为编译队列和常规队列? import java.util
如何将项目返回到 queue.Queue?如果任务失败,这在线程或多处理中很有用,这样任务就不会丢失。 docs for queue.Queue.get()说函数可以“从队列中删除并返回一个项目”,但
如何在多个 queue.Queue 上进行“选择”同时? Golang 有 desired feature及其 channel : select { case i1 = 声明。 线程:queue 模
http://docs.python.org/2/library/queue.html#Queue.Queue.put 这似乎是一个幼稚的问题,但我在文档和谷歌搜索中都没有找到答案,那么这些方法是线程
这可能是个愚蠢的问题,但我对与 .dequeue() 和 $.queue() 一起使用的 .queue() 感到困惑> 或 jquery.queue()。 它们是否相同,如果是,为什么 jquery
我正在尝试创建一个线程化的 tcp 流处理程序类线程和主线程对话,但是 Queue.Queue 也没有做我需要的,服务器从另一个程序接收数据,我只想传递它进入主线程进行处理这里是我到目前为止的代码:
The principal challenge of multi-threaded applications is coordinating threads that share data or ot
在Queue模块的queue类中,有几个方法,分别是qsize、empty 和 full,其文档声称它们“不可靠”。 他们到底有什么不可靠的地方? 我确实注意到 on the Python docs网
我需要一个队列,多个线程可以将内容放入其中,并且多个线程可以从中读取。 Python 至少有两个队列类,Queue.Queue 和 collections.deque,前者似乎在内部使用后者。两者都在
明天我将介绍我选择进程内消息队列实现的基本原理,但我无法阐明我的推理。我的合作设计者提议我们实现一个简单的异步队列,只使用基本的作业列表和互斥锁来控制访问,我建议在嵌入式模式下使用 ActiveMQ。
在 scala 中定义了一个特征: trait Queue[T] Queue 是一种类型吗?或其他东西,例如类型构造函数? 来自 http://artima.com/pins1ed/type-para
我看到 SML/NJ 包含一个队列结构。我不知道如何使用它。如何使用 SML/NJ 提供的附加库? 最佳答案 Queue structure SML '97 未指定,但它存在于 SML/NJ 的顶级环
我是 D3 和 JavaScript 的新手。 我试图理解其中的 queue.js。 我已经完成了 this关联。但是仍然无法清楚地了解 queue.await() 和 queue.awaitAll(
所以我试图在我的 main.cpp 文件中调用一个函数,但我得到“错误:没有匹配函数来调用‘Queue::Queue()。” 队列.h #ifndef QUEUE_H #define QUEUE_H
假设我有一个 10 行的二维 numpy 数组 例如 array([[ 23425. , 521331.40625], [ 23465. , 521246.03125],
我是一名优秀的程序员,十分优秀!