ILookup接口与IDictionary


Answers:


111

ILookup每个键项可以包含多个项目-每个键映射到一个 IEnumerable<TElement>

另外,正如注释中所暗示的ILookup,当您可以更新中的值时,IDictionary它是不可变的(它公开了Add()允许获取设置值的方法和索引器)。

总之,它们的用例非常不同-当您需要固定值且不会(也不能更改)的1:N映射时,可以使用查找。另一方面,字典提供键值对的可变1:1映射,因此可以对其进行更新以添加或删除值。


1
实际上,每个条目都是一个IEnumerable<T>而不是一个T
加布

1
+1虽然为真,但在界面,更新可变性,关键要求等方面有更多不同将是一件很高兴的事

实施ILookup<TElement>并不能保证一成不变。您的答案似乎暗示确实如此。它仅提供查找的只读视图。而且,接受方法ILookup<TElement>可能如何处理查找内容的更改取决于该方法,并且,如果没有文档,则可以避免在外来代码仍引用引用并根据您的用例而改变查找时更安全。查看关于人们如何错误地认为实现IReadOnlyList<T>应该暗示列表是不可变的整个讨论。
2015年

1
@binkiILookup<TKey, TElement>如果打算对其进行突变,则公开一个可变的实现是一个坏主意。如果没有文档,您应该可以假定它遵守其界面。当然,现实生活是一团糟,但是如果您使用一种ToLookup扩展方法创建查找,则可以放心地假设它不会被修改。您可以采取多种方式,但是您ILookup<TKey, TElement>键入的成员的消费者应该遵循最少惊讶的原则。如果你发现你已经通过了其中一个发生变异,从可观察到的方式throw
Aluan Haddad

1
我的评论中存在语法错误:我的意思是您的消费者应该能够假定您遵循了最小惊讶原则。
Aluan Haddad

4

它比更加简单IDictionary。Linq使用它。它只有ContainsItemCountIDictionaryAddRemove等等。


您是不是说ILookup是IDictionary的只读子集?
蒂莫西·斯旺

1
种类...但是每个元素都是一个IGrouping,因此一个键可以有多个元素,因此映射得不好。我对词典有一个只读接口会很高兴。
菲利普

2
@Philippe字典的只读接口是IReadOnlyDictionary<TKey, TValue>并且Dictionary<TKey, TValue>类的所有实例都实现它(ToDictionary返回类实例,因此它也可以工作),因此您可以将任何字典公开为只读。
Los Frijoles

1
@LosFrijoles谢谢,我不知道这个存在。我目前仍停留在.NET 4.0上,并错误地认为如果不检查MSDN,它就不存在。
Philippe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.