Function parameters: IEnumerable, ICollection or array?
如果我有一个函数接受一个特定类型的集合,我应该使用什么参数类型?我以前假设IEnumerable是违约,但我想知道这是否正确,如果是,为什么。ICollection也似乎是一个有效的候选者(因为它的名字),但我觉得IEnumerables对用户更友好。我想看看框架给我们的例子是个好主意,但是我发现像String.Join这样的东西需要一个字符串数组。
- 在此之前已经回答过:stackoverflow.com/questions/3559868/…此致问候。
- String.Join在.NET 4时间框架中添加了一个重载,因此它需要一个IEnumerable。将数组日期从前一般日期开始的重载…
- @奥斯卡:那是关于返回类型——我说的是参数。
- 您希望为参数stack支持哪些集合类型?排队?字典?数组?或者其他一些,您希望对参数化函数内的集合进行只读访问还是读写访问?这些将有助于更好地解释答案和更多建议。
- @CSharpvj:那要视情况而定。我要的是一般案件,不是具体案件。
- @保护者一号,没关系。我更新了我的答案,显示了一般和具体的建议。特别是,我的答案中的博客文章链接对你有更好的帮助。
你选择对客户要求最少但能让你完成工作的客户。如果您可以通过ICollection摆脱IEnumerable,那么您应该使用它,因为这为您的API客户端提供了更大的灵活性。
IEnumerable比ICollections更受欢迎。这是对你问题的慷慨回答。
接口主要用作函数中的参数或返回类型,以支持SOLID中的I设计原则(接口分离原则),以使铸造更容易,支持将多个具体类型传递给接口参数,并隐藏(封装)实际参数类型,使其不受publ客户机的影响。集成电路功能。
非常基本,它公开了枚举器,它支持对非泛型集合进行简单迭代。
1 2
| [ComVisibleAttribute(true)]
public interface IEnumerable |
ICollection接口扩展IEnumerable;IDictionary和IList是扩展ICollection的更专用的接口。IDictionary实现是键/值对的集合,如哈希表类。IList实现是一个值集合,其成员可以通过索引访问,如arraylist类。一些限制对其元素(如队列类和堆栈类)访问的集合直接实现ICollection接口。如果IDictionary接口和IList接口都不满足所需集合的要求,请从ICollection接口派生新的集合类,以获得更大的灵活性。
1 2
| [ComVisibleAttribute(true)]
public interface ICollection : IEnumerable |
来自msdn关于ilist的更多信息:IList是ICollection接口的后代,是所有非泛型列表的基接口。IList实现分为三类:只读、固定大小和可变大小。无法修改只读IList。固定大小的ilist不允许添加或删除元素,但允许修改现有元素。可变大小的ilist允许添加、删除和修改元素。
提示:
In case you just want to support foreach for your collection
parameter, IEnumerable should be enough. In case you also want the
support for adding and removing items from the collection, IList is
the better choice.
建议:这篇博文:IEnumerable、ICollection、iList相比较,一定会帮助你做出更好、准确的决定。
此外,请看本文了解IList和IEnumerable的性能和其他比较。
- -1:我再也不同意了。总是(对于给定的值always)使用完成工作的最小抽象,这样您的客户机代码(您正在编写的代码)就不受使用同一容器的限制,您的函数变得更通用,并且具有更大的重用潜力。
- 嗯@binaryworrier我更新了答案,只在需要添加或删除项的支持时才使用ilist,如果只需要每个支持,则使用ienumerable。我希望您现在能更好地理解答案。
- 对不起,我还是不同意。最好使用IEnumerable,因为它是最小抽象。例如,假设您有一个函数,它接受一个数字列表,得到最小值、最大值和平均值。如果函数采用ICollection,则任何实现I collection的类都可以使用它。如果它是为获取IEnumerable而写的,那么它可以处理任何事情,因为您可以很容易地为那些yield return项的数据阅读器或文件阅读器编写一个适配器,而不会造成额外的存储或处理开销,并且仍然使用相同的函数。
- @尽管你不同意我的回答,但我完全同意你的意见。如果最初的question给出了关于只读使用或读写使用(所需的收集参数)的明确提示,答案将更加具体,并且重点是……