Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 函数参数:IEnumerable、ICollection还是数组?_C#_.net_Parameters - Fatal编程技术网

C# 函数参数:IEnumerable、ICollection还是数组?

C# 函数参数:IEnumerable、ICollection还是数组?,c#,.net,parameters,C#,.net,Parameters,如果我有一个接受某一类型集合的函数,我应该使用哪种参数类型? 我之前假设IEnumerable是默认值,但我想知道这是否正确,如果正确,原因是什么。 ICollection似乎也是一个有效的候选项(因为它的名称),但我得到的印象是,IEnumerables更易于使用。 我想看看框架给我们提供的示例会是个好主意,但我发现类似于String.Join的东西需要一个字符串数组。您选择对客户端施加最小影响但允许您完成工作的字符串。如果您可以在ICollection上使用IEnumerable,那么您应该

如果我有一个接受某一类型集合的函数,我应该使用哪种参数类型?
我之前假设
IEnumerable
是默认值,但我想知道这是否正确,如果正确,原因是什么。
ICollection
似乎也是一个有效的候选项(因为它的名称),但我得到的印象是,IEnumerables更易于使用。

我想看看框架给我们提供的示例会是个好主意,但我发现类似于
String.Join
的东西需要一个字符串数组。

您选择对客户端施加最小影响但允许您完成工作的字符串。如果您可以在
ICollection
上使用
IEnumerable
,那么您应该使用它,因为这为API的客户端提供了更大的灵活性。

IEnumerable比ICollection更受欢迎。
是对您问题的慷慨回答。

接口主要用作函数中的参数或返回类型,以支持
SOLID
中的
I
设计原则(接口分离原则),使浇筑更容易,支持将多个混凝土类型传递给接口参数和隐藏(封装)公用函数客户端的实际参数类型

  • 关于
    IEnumerable
非常基本,它公开了枚举器,它支持对非泛型集合进行简单迭代

[ComVisibleAttribute(true)]    
public interface IEnumerable
  • 以下是关于
    i收集的信息
ICollection接口扩展了IEnumerable;IDictionary和IList是扩展ICollection的更专门化的接口。IDictionary实现是键/值对的集合,就像Hashtable类一样。IList实现是一组值,其成员可以通过索引访问,就像ArrayList类一样。 某些限制对其元素的访问的集合(如队列类和堆栈类)直接实现ICollection接口。 如果IDictionary接口和IList接口都不满足所需集合的要求,则从ICollection接口派生新集合类,以获得更大的灵活性

[ComVisibleAttribute(true)]
public interface ICollection : IEnumerable
  • 下面是关于IList的
    interface:

    [ComVisibleAttribute(真实)] 公共接口IList:ICollection,IEnumerable

来自MSDN的有关IList的更多信息:
IList
ICollection
接口的后代,是所有非泛型列表的基本接口。IList实现分为三类:只读、固定大小和可变大小。无法修改只读IList。固定大小的IList不允许添加或删除元素,但允许修改现有元素。可变大小的IList允许添加、删除和修改元素

提示:

如果您只想为您的收藏提供
foreach
参数,
IEnumerable
应该足够了。万一你也想要 支持从集合中添加和删除项,
IList
更好的选择

建议: 这篇博文:肯定会帮助你做出更好、更准确的决定


此外,请查看IList和IEnumerable的性能和其他比较。

前面已经回答了这个问题:致以最良好的祝愿。在.NET 4时间框架中添加了一个重载,因此它需要一个
IEnumerable
。获取数组的重载可以追溯到泛型之前的日子…@Oscar:这是关于返回类型的-我说的是参数。您希望为参数:Stack支持什么集合类型?队列字典?阵列?或者其他一些,您希望对参数化函数中的集合进行只读访问还是读写访问?这些将有助于更好地解释答案和更多建议。@Protectorone没关系。我更新了我的答案,以显示概括和具体的建议。特别是,我的答案中的博客链接会对你有更好的帮助。Always(对于给定的值Always)使用完成任务的最小抽象,这样您的客户机代码(您正在编写的代码)就不必使用相同的容器,您的函数变得更通用,具有更大的重用潜力。Well@BinaryWorrier我更新了答案,仅当需要添加或删除项的支持时才使用IList,如果只需要foreach支持,则使用IEnumerable。我希望您现在更好地理解了答案。抱歉,但我仍然不同意<代码>IEnumerable
应该是首选,因为它是最小的抽象。e、 假设你有一个函数,它接受一系列数字,并得到最小值、最大值和平均值。如果函数采用ICollection,则实现I集合的任何类都可以使用它。如果它被编写为接受IEnumerable,那么它可以处理任何事情,因为您可以轻松地为数据读取器或文件读取器编写适配器,
产生返回项,而不会造成额外的存储或处理开销,并且仍然使用相同的函数。@BinaryWorrier尽管您不同意我的回答,但我完全同意您的评论。如果原始的
问题
清楚地给出了关于只读用法或读写用法(所需的集合参数)的提示,那么答案会更具体,并且达到……同意的程度。但是,在处理方法中作为输入参数传递的IEnumerable对象时,请注意。如果可以保证方法使用者始终提供列表、数组或集合,则可以改用ICollection。否则,您将需要枚举整个枚举(例如转换ToList())一次,然后使用枚举对象。