web-dev-qa-db-ja.com

IListインターフェースの実装

私はジェネリックに不慣れです。 IList<T>インターフェイスから派生させて独自のコレクションを実装したいと思います。

IList<T>インターフェースを実装するクラスへのリンクを教えてください。または、少なくともAddメソッドとRemoveメソッドを実装するコードを教えてください。

13
Ashish Ashu

非常に説得力のある理由がない限り、必要なものがすべて揃っているため、System.Collections.ObjectModel.Collection<T>から継承するのが最善の策です。

IList<T>の実装者はthis[int](インデクサー)をO(1)(基本的には常時アクセス))に実装する必要はありませんが、強力であることに注意してください。そうすることをお勧めします。

14
Anton Gogolev

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
}
33
tranmq

Visual Studioは、IList <>のようなインターフェイスの自動完全動作実装を提供します。

あなたはこのコードを書く必要があるだけです(

readonly IList<T> _list = new List<T>(); 

重要なものです!)

public class MyCollection<T> : IList<T>
{
    // This line is important. Without it the auto implementation creates only
    // methods with "NotImplemented" exceptions
    readonly IList<T> _list = new List<T>();
}

enter image description here

次に、電球の記号をクリックするか、カーソルをIList <>に置き、Strg + "。"次のようないくつかの実装が提供されます。

enter image description here

3
marsh-wiggle

Monoプロジェクト をご覧ください。利用可能な完全なソースコードがありますので、いくつかのクラスがどのように実装されているかを見ることができます。たとえば、「System.Collections.Generics.List <T>」です。

1
TcKs

ほとんどの場合、単にList<T>を使用するか、List<T>から派生させることができます。 List<T>から派生した場合、追加と削除の実装が自動的に取得されます。

1
chikak

多くの場合、リストからの継承が最も迅速なアプローチですが、別のクラス(ContextBoundObjectなど)から継承する必要がある場合は、後で制限することができます。 IListの実装は非常に迅速であり、上記で指摘したように、柔軟性が大幅に向上します。

0
Zotak