【发布时间】:2020-02-10 23:19:51
【问题描述】:
我读过文章说如果你想要IEnumerable<T> 的功能,但也想要Count 属性,请使用ICollection<T>。
但是,既然System.Linq.Enumerable 中的扩展方法提供了诸如ElementAt() 之类的方法,为什么不直接使用IList<T>,因为它使用了索引器?
在我看来,ICollection<T> 可以做 IList<T> 可以做的事情,只是以一种更冗长且可读性更低的方式。
在哪种情况下使用ICollection<T> 比IList<T> 更易读/更有效,更符合 SOLID 原则,或者在某些情况下使用ICollection<T> 更好?
编辑:
重复问题的答案没有回答我的问题,因为他们避免谈论 ICollection<T> 可以做 IList<T> 所做的事情,但方式更丑陋。
如果他们都做同样的事情,为什么不使用清洁剂IList<T>?
我在这里得到了更好的答案: https://www.reddit.com/r/csharp/comments/dl9xao/why_use_icollectiont_over_ilistt/
【问题讨论】:
-
所以你的意思是我可以调用你的方法或读取你的属性,取回一个列表,然后开始向其中添加元素?
-
您的问题中涉及的 3 种类型告诉我不同的事情。 IEnumerable 告诉我,我将获得一组项目。 ICollection 告诉我,我将获得一组项目,以保证轻松快速地访问其中的项目数量。 List 告诉我我会得到一个我可以操作的集合。您必须决定在每种情况下哪个级别是合适的。
-
但是 ICollection 为您提供了一个您也可以操作的集合。 ICollection 似乎与 IList 具有所有相同的功能,只是没有那么干净。
-
很遗憾,我觉得这个问题跑题了,因为它间接征求人们的意见和建议。没有固定的单一答案说“在那个时候返回这个,否则这个其他的东西”。关于您是否应该退回其中一个,我有几种意见,这取决于很多因素,但归结为我的意见。
-
我认为您的问题实际上是重复的,并且由这些答案(广泛)解决 - 这是一个用例场景。一种这样的场景是使用
IDictionary或dynamic类型(System.Dynamic.ExpandoObject)。
标签: c# list ienumerable icollection