ienumerable vs list<T>

本文关键字:gt vs lt ienumerable list | 更新日期: 2023-09-27 17:49:24

据说IEnumerable用于自定义集合。其中一个用途是foreach循环,用于遍历自定义集合。

然而,我的问题是,而不是制作一个自定义集合,首先实现IEnumerable,然后构造另一个类来实现IEnumerator来存储一组自定义对象,为什么我们不能只使用list<your_customer_object>

提前感谢您的帮助。

ienumerable vs list<T>

因为您可能想要实现不同的数据结构。IEnumerable抽象了序列的概念,而List具有索引、添加/删除项和自己的数据结构的概念。

作为一个不同结构的例子,这里有一个类,它允许你进入一个无限的foreach循环。

public class InfiniteSequence : IEnumerable<int>
{
    public IEnumerator<int> GetEnumerator()
    {
        return new InfiniteEnumerator();
    }
    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
    class InfiniteEnumerator : IEnumerator<int>
    {
        public void Dispose()
        {
            throw new NotImplementedException();
        }
        public bool MoveNext()
        {
            Current++;
            return true;
        }
        public void Reset()
        {
            Current = 0;
        }
        public int Current { get; private set; }
        object IEnumerator.Current
        {
            get { return Current; }
        }
    }
}

当然可以用List<T>

如果List<T>符合您的需求,那么使用它,不要创建继承IEnumerable<T>的新类。

List<T>不适合您的需要时,您可以提供自己的IEnumerable<T>实现。典型的例子是当您想要支持对集合进行延迟求值时,可能使用使用yield return的方法。

正如@ken2k所说,你可以只List<T>,你会得到一个通用版本的列表与你的T类型。但是,如果您想隐藏此实现并自定义List<T>或包含新特性的一些操作,则可以继承List并实现自己的方法。示例:

public class CustomerCollection : List<Customer> // at this time, you have all methods from List such as Add, Remove, [index] etc...
{
   public double AverageAge()
   {
       return this.Average(customer => customer.Age)
   }
   // other methods...
}

IEnumeralbe是。net框架中最抽象的集合,你可以在这个抽象中进行交互。

您可以使用List<T>或任何其他泛型集合类型。毕竟List<T>实现了IEnumerable<T>

你是否有一个特殊的边缘情况,你需要一个定制的系列?

当然,您可以将成员定义为List<T>,但这会将类的客户绑定到特定的实现。如果您将成员定义为IEnumerable<T>(假设消费者只想枚举您的集合),那么您可以将实现更改为实现接口而不破坏契约的不同集合类型。如果您将List<T>更改为SortedSet<T>以实现订单,则您的消费者不会受到影响。

这基本上是针对接口而不是具体类型编码的优势。

你可以使用不同的接口,例如。ICollection<T>如果你的消费者想要的不仅仅是枚举。

如果没有其他功能,请继续。专门的集合用于需要做……特殊的…的东西。

(例如,ListViewItemCollection在更新时必须通知它的父ListView,所以它需要实现IList(T),因此IEnumerable(T)。如果您有自定义集合,它可能会继承自定义集合。仅从IEnumerable(T)继承只有当您的集合可以枚举,但不能索引时才有意义。

你可以。

public class List<T> : IList<T>, ICollection<T>, 
IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, 
IEnumerable 

我认为这里混淆的根源是"自定义集合"answers"自定义类实例的集合"之间的区别。在这两种情况中,您的List<CustomObject>是后一种情况—您只是重用由其他人创建的集合,并利用泛型来保留项目类型信息,仅此而已。真正的自定义集合可能会实现IEnumerable<T>,但您很少(如果有的话)需要它。

在这种情况下,你不仅可以,而且应该使用List<CustomObject>