Реализует интерфейс IList

Я новичок в дженерики. Я хочу реализовать свою собственную коллекцию, получив ее из IList<T> интерфейс.

не могли бы вы предоставить мне ссылку на класс, который реализует IList<T> интерфейс или предоставить мне код, который, по крайней мере, реализует Add и Remove методами?

5 ответов


Если у вас нет очень веской причины сделать это, ваш лучший выбор будет наследовать от System.Collections.ObjectModel.Collection<T> Так как у него есть все, что вам нужно.

обратите внимание, что хотя конструкторы IList<T> не требуется для реализации this[int] (индексатор), чтобы быть O(1) (в основном, постоянный доступ), настоятельно рекомендуется сделать это.


В дополнение к получению из List<T>, вы можете фасаде List<T> и добавьте дополнительные функции в свой класс фасада.

class MyCollection<T> : IList<T>
{
    private readonly IList<T> _list = new List<T>();

    #region Implementation of IEnumerable

    public IEnumerator<T> GetEnumerator()
    {
        return _list.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    #endregion

    #region Implementation of ICollection<T>

    public void Add(T item)
    {
        _list.Add(item);
    }

    public void Clear()
    {
        _list.Clear();
    }

    public bool Contains(T item)
    {
        return _list.Contains(item);
    }

    public void CopyTo(T[] array, int arrayIndex)
    {
        _list.CopyTo(array, arrayIndex);
    }

    public bool Remove(T item)
    {
        return _list.Remove(item);
    }

    public int Count
    {
        get { return _list.Count; }
    }

    public bool IsReadOnly
    {
        get { return _list.IsReadOnly; }
    }

    #endregion

    #region Implementation of IList<T>

    public int IndexOf(T item)
    {
        return _list.IndexOf(item);
    }

    public void Insert(int index, T item)
    {
        _list.Insert(index, item);
    }

    public void RemoveAt(int index)
    {
        _list.RemoveAt(index);
    }

    public T this[int index]
    {
        get { return _list[index]; }
        set { _list[index] = value; }
    }

    #endregion

    #region Your Added Stuff

    // Add new features to your collection.

    #endregion
}

вы можете посмотреть проект моно. Есть доступные полные исходные коды, sou вы можете посмотреть, как реализованы некоторые классы. Например " система.Коллекции.Дженерик.List".


В большинстве случаев вы можете просто использовать List<T> или вытекают из List<T>. Если вы производны от List<T> вы автоматически получите реализацию для добавления и удаления.


наследование от List часто является самым быстрым подходом, но может быть ограничено позже, если вам нужно наследовать от другого класса(например, ContextBoundObject и т. д.). Это довольно быстро реализовать IList и как указывалось выше, это дает гораздо больше гибкости.