1. ホーム
  2. c#

[解決済み] IEnumerableとICollectionとIListを使用したカスタムコレクション

2022-02-07 07:10:39

質問

独自のカスタムデザインをしたい GenericCollection クラスがあります。を使用して派生させるという選択肢はたくさんあります。 IEnumerable , ICollection および IList であり、後者にはいくつかの機能が追加されています。

私は少し混乱している、もし私が IEnumerable<T> この場合、コレクションを実際に保持するオブジェクトを宣言する必要があるかもしれません。 _list .

public class GenericCollection<T> : IEnumerable<T>
{
    private List<T> _list;
    //...
}

しかし、もし ICollection<T> または IList<T> を宣言する必要はありません。 List オブジェクトは暗黙のうちに利用可能です。

public class GenericCollection<T> : IList<T>
{
    // no need for List object
    //private List<T> _list; 
    //...
}

に関して、この2つのアプローチの違いは何でしょうか? パフォーマンス ?

特に独自のコレクションを設計する場合、どのようなシナリオでそれぞれが好まれるのでしょうか。私は、軽量で性能の良いコレクションに興味があります。これは、以下の方法で実現できると思います。 IEnumerable<T> しかし、具体的にどのように、またどのような理由でそれを選ぶのでしょうか?

既存の投稿をいくつか見てみましたが、必要な情報を与えてくれるものはありませんでした。

IList' vs 'ICollection' vs 'Collection'を返します。

どのように解決するのですか?

IEnumerable , ICollection および IList (一般に I プレフィックス) は単なる インターフェース . これらは、あなたのクラスが何を行うかを公開するものです。 継承する インターフェイスは、そのクラスがしなければならないことを、デフォルトの実装として提供するものではありません。

どのインターフェイスを選ぶかについては、次のような簡単なガイドがあります。

  • An IListICollection インデックスでアクセスできること。
  • An ICollectionIEnumerable などに簡単にアクセスできるようになりました。 Add , Remove および Count .
  • An IEnumerable は、列挙できるものであれば、たとえそのリストが列挙するまでは存在しないものであってもです。

コレクション用に拡張したい(またはロジックの大部分を実行するプライベートフィールドとして保持したい)クラスは、以下のとおりです。 List<T> , Collection<T> を実装している)。 IList<T> しかし、より簡単にオーバーライドすることができます。 Collection<T> vs List<T> インターフェースで何を使うべきですか? この2つの大きな違いについては、こちらをご覧ください) ObservableCollection<T> のような、リストではないコレクションもあります。 Dictionary<T, U>HashSet<T> . これらの詳細については、そのクラスに関するMSDNドキュメントを参照してください。