Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Dictionary.Keys返回的KeyCollection操作的速度有多快?(.NET)_C#_.net_Collections_Dictionary_Complexity Theory - Fatal编程技术网

C# Dictionary.Keys返回的KeyCollection操作的速度有多快?(.NET)

C# Dictionary.Keys返回的KeyCollection操作的速度有多快?(.NET),c#,.net,collections,dictionary,complexity-theory,C#,.net,Collections,Dictionary,Complexity Theory,定义方法和属性(类型为ICollection)。 我对该方法的(渐进)复杂性和实现中的属性感兴趣 考虑定义 IDictionary<int, string> dict = new Dictionary<int, string>(); int k = new Random().Next(); IDictionary dict=new Dictionary(); int k=new Random().Next(); 考虑到我们已经添加到字典 DICT N< /代码>唯一

定义方法和属性(类型为
ICollection
)。 我对该方法的(渐进)复杂性和实现中的属性感兴趣

考虑定义

IDictionary<int, string> dict = new Dictionary<int, string>();
int k = new Random().Next();
IDictionary dict=new Dictionary();
int k=new Random().Next();
考虑到我们已经添加到字典<代码> DICT <代码> N< /代码>唯一<代码> KEY ValuePaule<代码> S.

调用的预期(渐进)复杂度是多少?我希望它在
O(1)
中,但我没有在中找到它

调用
dict.Keys.Contains(k)
的预期(渐进)复杂度是多少?我希望它在
O(1)
中,但我在中或中都没有找到它。如果是在
O(1)
中,我不明白为什么
IDictionary.Keys
属性的类型是
ICollection
,而不是
ISet
(例如在Java中)。

您提供的属性在备注中说:

此方法接近O(1)操作

此外,如果单击,您将在备注中看到相同的内容:

此方法是O(1)操作

由于
IDictionary
只是一个接口,而不是一个实现,因此它不提供任何性能保证

对于内置的
字典
类型,方法应为O(1):

该方法实际上调用父字典的
ContainsKey
方法,因此也应该是O(1):


(两个引文均取自相关文档页面的“备注”部分。)

注意:
ISet
是.NET 4的新版本,
ICollection
IDictionary
从.NET 2开始就存在了。安东尼·佩格拉姆:那么我希望他们将
IDictionary.Keys
的类型更改为.NET 5中的
ISet
。这对许多客户来说将是一个突破性的变化。他们不会那样做的。话虽如此,记住,它只是一个接口,任何东西都可以实现。实际上,要实现
ISet
,您必须实现
ICollection
。因此,返回的实际对象可以很好地实现
ISet
。返回的接口类型没有说明实现细节,而仅仅是满足了实现的合同。@ Anthony Pegram:所有这些都被理解了(除了许多客户的“突破性改变”)——我不认为这是一个好的理由)。但是,返回的实际对象(
KeyCollection
)没有实现
ISet
,我认为应该实现。更重要的是,我认为它的类型应该是
ISet
,当类型是
ICollection
时,编程人员通常会想到类似
List
的东西,并(以我为例)询问关于复杂度的问题:)。但是,返回的集合具有典型的set属性:快速回答“Doyoucontainsomeelement”而不进行枚举,因此类型应该对应。如果他们可以重新执行,他们可能会更改它。但一个新的框架版本并不能完全消除过去的弊病。你可能不这么想,但是避免突破性改变是最重要的事情之一。这并不是说微软从来没有也永远不会在.NET中引入突破性的改变,但好处必须超越巨大。但事实上,他们也可以吃蛋糕。它们返回一个接口,其实现细节不必是恒定的。哦,很抱歉,我应该仔细阅读。但是关于
键.Contains的第二个问题在文档中没有答案,至少我找不到。@drasto:事实上,@Mehrdad:在我注意到OP对你答案的评论后,我实际上与你的同时进行了编辑。啊,很抱歉。。。不清楚到底发生了什么,我的错。这本字典真的不是O(1)。是O(对数n)