C# ILookup接口与IDictionary
界面与其他界面有何不同C# ILookup接口与IDictionary,c#,.net,C#,.net,界面与其他界面有何不同 我不明白这个界面是什么意思。它比IDictionary简单得多。它由Linq使用。它只有包含,项和计数IDictionary具有添加、删除等功能。ILookup项可以包含每个键的多个项-每个键都映射到一个iNumber 另外,正如注释中所暗示的那样,ILookup是不可变的,而您可以更新IDictionary中的值(它公开了一个Add()方法和一个允许获取和设置值的索引器) 总之,它们的使用情形是非常不同的——当您需要一个1:N的映射,其值是固定的并且不会(也不能)更改时
我不明白这个界面是什么意思。它比
IDictionary
简单得多。它由Linq使用。它只有包含
,项
和计数
<代码>IDictionary具有添加
、删除
等功能。ILookup
项可以包含每个键的多个项-每个键都映射到一个iNumber
另外,正如注释中所暗示的那样,ILookup
是不可变的,而您可以更新IDictionary
中的值(它公开了一个Add()
方法和一个允许获取和设置值的索引器)
总之,它们的使用情形是非常不同的——当您需要一个1:N的映射,其值是固定的并且不会(也不能)更改时,您可以使用查找。另一方面,字典提供了键值对的可变1:1映射,因此可以对其进行更新以添加或删除值。首先想到的是“多映射”支持(一个键可以映射到一组值)。可能是“”的重复。事实上,每个条目都是
IEnumerable
,而不是T
+1,如果为true,最好能有更多关于接口差异、更新可变性、关键需求等方面的内容。实现ILookup
并不能保证不变性。你的回答似乎暗示它是正确的。它仅提供查找的只读视图。此外,接受ILookup
的方法如何处理查找的内容更改取决于该方法,如果没有文档,则更安全的做法是避免在外来代码仍在引用查找时对其进行修改,具体取决于您的使用情况。查看关于人们如何错误地认为实现IReadOnlyList
应该意味着列表是不可变的整个讨论。@binki公开了ILookup
的可变实现如果你计划对它进行变异,这是个坏主意。如果没有文档,您应该能够假设它遵守其接口。当然,现实生活是混乱的,但如果您使用ToLookup
扩展方法之一创建查找,则可以安全地假定它不会被修改。您可以采用多种方式,但您的ILookup
类型会员的消费者应该遵循最小惊讶的原则。如果你发现你通过了一个以可观察的方式变异的测试,抛出
。我的评论中的语法错误:我的意思是你的消费者应该能够假设你遵循了最小惊讶的原则。你的意思是ILookup是IDictionary的只读子集吗?有点。。。但每个元素都是一个iGroup,因此一个键可以有多个元素,因此映射不好。如果字典有一个只读接口,我会很高兴。@Philippe字典的只读接口是IReadOnlyDictionary
,字典的所有实例都实现了它(ToDictionary
返回类实例,所以它也可以工作),所以你可以将任何字典公开为只读。@LosFrijoles谢谢,我不知道这本字典存在。我目前一直使用.NET4.0,错误地认为如果不检查MSDN,它是不存在的。