如何在ILookup<key, value>界面有所不同IDictionary<key, value>?
我不明白该ILookup接口的用途。
如何在ILookup<key, value>界面有所不同IDictionary<key, value>?
我不明白该ILookup接口的用途。
Answers:
ILookup每个键项可以包含多个项目-每个键映射到一个 IEnumerable<TElement>。
另外,正如注释中所暗示的ILookup,当您可以更新中的值时,IDictionary它是不可变的(它公开了Add()允许获取和设置值的方法和索引器)。
总之,它们的用例非常不同-当您需要固定值且不会(也不能更改)的1:N映射时,可以使用查找。另一方面,字典提供键值对的可变1:1映射,因此可以对其进行更新以添加或删除值。
IEnumerable<T>而不是一个T。
ILookup<TElement>并不能保证一成不变。您的答案似乎暗示确实如此。它仅提供查找的只读视图。而且,接受方法ILookup<TElement>可能如何处理查找内容的更改取决于该方法,并且,如果没有文档,则可以避免在外来代码仍引用引用并根据您的用例而改变查找时更安全。查看关于人们如何错误地认为实现IReadOnlyList<T>应该暗示列表是不可变的整个讨论。
ILookup<TKey, TElement>如果打算对其进行突变,则公开一个可变的实现是一个坏主意。如果没有文档,您应该可以假定它遵守其界面。当然,现实生活是一团糟,但是如果您使用一种ToLookup扩展方法创建查找,则可以放心地假设它不会被修改。您可以采取多种方式,但是您ILookup<TKey, TElement>键入的成员的消费者应该遵循最少惊讶的原则。如果你发现你已经通过了其中一个发生变异,从可观察到的方式throw。
它比更加简单IDictionary。Linq使用它。它只有Contains,Item和Count。IDictionary有Add,Remove等等。
IReadOnlyDictionary<TKey, TValue>并且Dictionary<TKey, TValue>类的所有实例都实现它(ToDictionary返回类实例,因此它也可以工作),因此您可以将任何字典公开为只读。