[解決済み] IEnumerableとICollectionとIListを使用したカスタムコレクション
質問
独自のカスタムデザインをしたい
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
IList
はICollection
インデックスでアクセスできること。 -
An
ICollection
はIEnumerable
などに簡単にアクセスできるようになりました。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ドキュメントを参照してください。
関連
-
[解決済み] usingディレクティブはネームスペースの内側と外側のどちらを使うべきですか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] IEnumerable<T> と IQueryable<T> を比較する。
-
[解決済み] IList<string> または IEnumerable<string> からカンマ区切りリストを作成する。
-
[解決済み] IEnumerable<T>のforeachのLINQでの等価性
-
[解決済み] IEnumerable<T> / IQueryable<T>の動的なLINQ OrderBy
-
[解決済み] 多人数/一人多役の関係でIEnumerableやList<T>ではなくICollectionを使用する理由は何ですか?
-
[解決済み】IEnumerable<T>コレクションにアイテムを追加するにはどうすればよいですか?
-
[解決済み】IEnumerable vs List - What to Use? どのように動作するのでしょうか?
-
[解決済み] エンティティのコレクションにおけるIListとIEnumerableの比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】2年前のMSDateを把握する【クローズド
-
VSでscanfエラーを恒久的に解決するには、ソースファイルを作成し、自動的に#define _CRT_SECURE_NO_WARNINGS 1を追加してください。
-
[解決済み] Collection<T> vs List<T> インターフェースで使うべきものは?