使用IEnumerator的自定义类型ArrayList

时间:2015-05-01 09:46:02

标签: c# generics

请参阅.net小提琴链接https://dotnetfiddle.net/E4eCWl

我有一个家庭作业,使用Book类型的ArrayList,所以虽然我知道List<T>是处理问题的正确方法,但我需要使用ArrayList,因为这是作业的一部分

如此使用

var books = new ArrayList<Book> {new Book("Moby Dick", 254)};

我的理解是,一旦我将自定义类型Book添加到Arraylist我正在创建一个自定义类,因为Resharper帮助我创建了一个新类以适应添加的书,因此添加了一个新类,但是现在我被卡住了,因为我不知道如何实现Add方法或者如何使用GetEnumerator ...

任何提示或网站,我可以去帮助我,或者让我走错路,开始创建类型。

自定义图书类

class Book
{
    public string Title { get; set; }
    public int NumberOfPages { get; set; }

    public Book(string title, int pages)
    {
        Title = title;
        NumberOfPages = pages;
    }

}

生成的类

class ArrayList<T> : IEnumerable
{
    internal void Add(Book book)
    {
        throw new NotImplementedException();
    }

    public IEnumerator GetEnumerator()
    {
        throw new NotImplementedException();
    }
}

2 个答案:

答案 0 :(得分:0)

ArrayList是一个来自.NET 1.0和1.1天的集合(很久很久以前就像星球大战介绍...... )。

因此,在{em> generics 之前引入了ArrayList,它不是通用集合。

它与List<T>的不同之处在于,集合项不是作为某种具体类型而是作为object键入的。也就是说,您可以向ArrayList添加任何类型的对象。

ArrayList list = new ArrayList();
list.Add(new Pear());
list.Add(new Apple());

此外,当您需要获取某个项目时,您需要再次向下转换到具体类型:

// list[0] will return the pear typed as System.Object
Pear pear = (Pear)list[0];
顺便说一句,正如我在第一段中所说的那样,它是一个已经过时了很长很长很久很久(......)的类,实际的代码不应再使用它了。您需要使用List<T>(或System.Collections.Generic命名空间内的任何其他通用列表)。

答案 1 :(得分:0)

我怀疑你打算使用非通用的System.Collections.ArrayList - 所以你有:

var books = new ArrayList { new Book("Moby Dick", 254) };

当然,使用非泛型集合通常是一个坏主意,除非赋值专门针对“有些遗留”的集合提出一个观点,否则我会质疑它的用处。 (基本上,听起来这个任务可能只是非常旧并且需要更新。如果你可以提供反馈,请这样做!)