2011-12-21 22 views
2

私はプログラムをしている間、時々私はこの疑いを持っています。私はList<T>を使用していますが、他は使用していません。List、Collection、Enumerableの違いは誰か分かりますか?

どのような状況でどのような状況で使用するのが良いかを知りたいときは、

+6

マニュアルを参照してください。 – SLaks

+0

Listでも何をしたいかによって異なりますジェネリックスは、何かが型指定リストであることを確認したり作成したりする素晴らしい方法ですが、あなた自身がかなりデザインしなければならない場所を列挙したい場合enumerator(Counter)IEnumerable が良いとは思うけど、foreachとforループもあります。それはあなたがやりたいことや速くしたいことに依存しています。Nicholasは最高の説明をするためにいくつかの素晴らしいリンクを投稿しました.. – MethodMan

答えて

6

私は、あなた自身でドキュメントを読むことができると確信しています。

  1. は、コレクションの列挙子を公開するインターフェイスです。反復をサポートできるようにするには、たとえばforeachループ内にこのインターフェイスを実装します。
  2. Collectionは、一般的に、さらに(すなわちAddRemoveContainsなどを使用)、コレクションのような振る舞いを持ちたいユーザー定義クラスによって拡張されている(したがって、あなたはそれを反復処理することができます)IEnumerableの実装です。また、「そのまま」使用することもできます。
  3. Listもまた、特定のタイプのオブジェクトのコンテナとして一般に "そのまま"使用されるIEnumerableの実装です(したがって、反復処理することができます)。バックグラウンドで動的に調整する配列を使用し、ArrayListの一般的な同等物です。 IEnumerableはジェネリックと非ジェネリックの両方になることができますが、CollectionListは、一般的なクラスとしてのみを使用することができることを

注意。

1

一覧は直線的にアイテムを保持しているインスタンス化タイプです。 (編集:リンクされたリストではなく、ダイナミックな配列で実装されていると言われていますが、それは私の推測でした)。

ICollection/CollectionBaseおよびIEnumerableは、直接的にインスタンス化可能な型ではありません。

CollectionBase/ICollectionは、それ自身をコレクションとみなし、複数のアイテムを保持する任意のクラスによって継承または実装される基本クラス/インターフェイスです。 CollectionBase/ICollectionでも、コレクションの実装を知らなくてもコレクションを渡すことができます。

IEnumerableも、コレクションを反復処理するためのメソッドを提供するインターフェイスです。 IEnumerableでは、基本的にコレクション上でforeachループを使用できます。インターフェイスメソッドを直接使用してC++スタイルのイテレータを取得することもできますが、foreachループのエラーが起こりにくいです。

+2

Listリンクされたリストではなく動的配列を使用します。 – Tudor

+1

@Digitlworld:MicrosoftのCLRチームの奇妙な世界では、リストは実際にはCSの意味でのリストではありません。「SCG.List 」と「SC.List」のバッキングストアは、割り当てとコピーによって動的に増加する配列です。 ICollectionとIEnumerableはまったく型ではなく、インタフェースです。 –

+0

C#土地では、インターフェイス、抽象クラス、および通常クラスはすべて「タイプ」であると私は理解していました。リフレクションベースの定義のインスタンスは、すべて「Type」の許容値です。 – digitlworld

0

あなたが(下記参照)3の定義を見れば、あなたはListEnumerableICollectionを実装し、ICollectionIEnumerableを実装していることがわかります。

Listです。CLASSは、同じタイプのアイテムに加えて、他の2つのインターフェイスで指定された機能の可変数を格納できます。

ICollectionは、コレクションを操作する一般的な方法を指定するインターフェイスです。注:これはインタフェースなので、インスタンス化することはできません。

IEnumerableは、コレクションを反復する方法を指定するインターフェイスです。注:これはインタフェースなので、インスタンス化することはできません。

List

インデックスによってアクセスできるオブジェクトの厳密に型指定されたリストを表します。リストを検索、並べ替え、操作するためのメソッドを提供します。

public class List<T> : IList<T>, ICollection<T>, 
IEnumerable<T>, IList, ICollection, IEnumerable 

ICollection

ジェネリックコレクションを操作するメソッドを定義します。

public interface ICollection<T> : IEnumerable<T>, 
IEnumerable 

IEnumerable

指定した型のコレクションに対する単純な反復処理をサポートする列挙子を、公開します。

public interface IEnumerable<out T> : IEnumerable 
関連する問題