什么时候应该使用列表而不是 ICollection 或 IEnumerable? [关闭]

Posted

技术标签:

【中文标题】什么时候应该使用列表而不是 ICollection 或 IEnumerable? [关闭]【英文标题】:When should I use Lists instead of ICollection or IEnumerable? [closed] 【发布时间】:2020-01-13 06:57:14 【问题描述】:

我不知道何时需要使用列表而不是 ICollection 或 IEnumerable(当然还有数组)。当我需要迭代和修改集合和枚举时,我个人使用集合,而我只需要迭代它。

【问题讨论】:

你能指出你读过的关于这个问题的文章吗? 别忘了IReadOnlyList<T>IReadOnlyCollection<T>!但这是另一个网站的问题,真的。 嗯,经验法则是 - 对于 input 参数,general 越多越好,即void MyMethod(IEnumerable<int> value) 优于 void MyMethod(List<int> value)return 值正好相反:List<int> MyMethod() 现在比 IEnumerable<int> MyMethod() 更好 查看此链接,例如:***.com/questions/3628425/… 【参考方案1】: 何时以及为什么我们应该选择 IEnumerable

这是 system.Collection 下任何集合的基本接口。如果您只想要迭代,那么它是使用的最佳选择。迭代意味着您不想要任何基于索引的搜索或任何写入或任何插入或删除。(仅读取记录)。您只能读取记录,不能读取其他内容。

public interface IEnumerable   
    // Summary:  
    // Returns an enumerator that iterates through a collection.  
    //  
    // Returns:  
    // An System.Collections.IEnumerator object that can be used to iterate through  
    // the collection.  
    [DispId(-4)]  
    IEnumerator GetEnumerator();  
  

IEnumerable 仅包含 GetEnumerator() 方法,如只读迭代。

何时以及为什么我们应该使用 ICollection

ICollection 比 IEnumerable 领先一步。如果我们想要更多的功能,比如添加或删除元素,那么最好使用 ICollection,因为我们无法使用 IEnumerable 来实现。 ICollection 扩展了 IEnumerable。它支持基于非索引的操作,例如 - 在集合中添加项目、删除、检查包含的项目等。ICollection 具有“添加”方法(参见屏幕截图 2)。因此,没有任何索引作为参数来在特定索引处插入或删除元素。

[ComVisible(true)]  
public interface ICollection: IEnumerable   
    int Count   
        get;  
      
    bool IsSynchronized   
        get;  
      
    object SyncRoot   
        get;  
      

    void CopyTo(Array array, int index);  
  
我们何时以及为何使用 IList

这是 System.Collection 中唯一包含 IEnumerable 和 ICollection 的所有功能以及附加功能的接口。

正如您在下面的代码中看到的,IList 具有 Insert 和 Remove 方法。这两种方法都在其参数中接受索引。因此,它支持基于索引的集合操作。

IList 是所有集合接口层次结构中的最后一个接口。它扩展了 ICollection。

[ComVisible(true)]  
public interface IList: ICollection, IEnumerable   
    bool IsFixedSize   
        get;  
      
    bool IsReadOnly   
        get;  
      
    int Add(object value);  
    void Clear();  

    bool Contains(object value);  
    int IndexOf(object value);  
    void Insert(int index, object value);  
    void Remove(object value);  
    void RemoveAt(int index);  
  

IList 可以接受任何我们可以传递的集合示例

List < string > lst = new List < string > ();  

IList < string > str = lst;  

string[] arr = new string[]   
    "one",  
    "two",  
    "three"  
;  
IList < string > str = arr;  

ArrayList lst = new ArrayList();  
lst.Add("tanuj");  
IList str = lst;  
我们何时以及为何使用 IList,为什么使用 IList 而不是 List

List 是具体的类。此类实现 IList、ICollection、IEnumerable。 IList 为我们提供了充分的灵活性来公开 list 实现的任何方法。

如果我们正在创建一个类库并将 DLL 提供给两个不同的客户端以公开功能,那么很容易在接口而不是类中进行任何更改。下面是例子。

如果我们将 Class OR LIST 暴露在世界之外,则处理每个使用相同功能的客户端会更加困难。所以,永远不要改变具体的课程。始终公开接口。

【讨论】:

以上是关于什么时候应该使用列表而不是 ICollection 或 IEnumerable? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

返回列表而不是IQueryable

什么时候使用 StringIO,而不是加入字符串列表?

何时在 F# 中使用序列而不是列表?

什么时候应该在 C# 中使用结构而不是类?

什么时候应该使用 MySQLi 而不是 MySQL?

什么时候应该使用任务而不是协程?