IEnumerableはカスタムコレクションで使用されると言われています。用途の1つは、カスタムコレクションをトラバースするために使用されるforeachループです。
ただし、私の質問は、最初に実装するカスタムコレクションを作成してから、カスタムオブジェクトのグループを格納するIEnumerableために実装する別のクラスを構築する代わりにIEnumerator、なぜ単にを使用できないのかということlist<your_customer_object>です。
助けてくれてありがとう。
IEnumerableはカスタムコレクションで使用されると言われています。用途の1つは、カスタムコレクションをトラバースするために使用されるforeachループです。
ただし、私の質問は、最初に実装するカスタムコレクションを作成してから、カスタムオブジェクトのグループを格納するIEnumerableために実装する別のクラスを構築する代わりにIEnumerator、なぜ単にを使用できないのかということlist<your_customer_object>です。
助けてくれてありがとう。
別のデータ構造を実装したい場合があるためです。IEnumerableはシーケンスの概念を抽象化しますListが、 にはインデックス、アイテムの追加/削除、および独自のデータ構造の概念があります。
foreach別の構造の例として、無限ループに入ることができるクラスを次に示します。
public class InfiniteSequence : IEnumerable<int>
{
public IEnumerator<int> GetEnumerator()
{
return new InfiniteEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
class InfiniteEnumerator : IEnumerator<int>
{
public void Dispose()
{
throw new NotImplementedException();
}
public bool MoveNext()
{
Current++;
return true;
}
public void Reset()
{
Current = 0;
}
public int Current { get; private set; }
object IEnumerator.Current
{
get { return Current; }
}
}
}
もちろん使えますList<T>。
ニーズに合う場合List<T>は、それを使用し、から継承する新しいクラスを作成しないでくださいIEnumerable<T>。
IEnumerable<T>ニーズに合わない場合は、独自の実装を提供List<T>します。この標準的な例は、コレクションの遅延評価をサポートしたい場合です。おそらく を使用するメソッドを使用しますyield return。
@ ken2kが言ったようにList<T>、TタイプのListのジェネリックバージョンを取得できます。ただし、この実装を非表示にして、新しい機能を含む操作をカスタマイズしたい場合List<T>は、List から継承して独自のメソッドを実装できます。サンプル:
public class CustomerCollection : List<Customer> // at this time, you have all methods from List such as Add, Remove, [index] etc...
{
public double AverageAge()
{
return this.Average(customer => customer.Age)
}
// other methods...
}
IEnumeralbeは .Net Framework のコレクションの最も抽象化されたものであり、この抽象化で対話することができます。
List<T>またはその他のジェネリック コレクション型を使用できます。やっぱりList<T>実装IEnumerable<T>。
オーダーメイドのコレクションでカバーする必要がある特定のエッジ ケースはありますか?
もちろん、メンバーを として定義することもできますがList<T>、それはクラスの顧客を特定の実装にバインドします。メンバーを次のように定義するとIEnumerable<T>(コンシューマーがコレクションの列挙のみを希望すると仮定して)、契約を破ることなく、インターフェイスを実装する別のコレクション タイプに実装を変更できます。List<T>実装順序を からに変更してもSortedSet<T>、消費者は影響を受けません。
基本的には、具象型ではなくインターフェースに対してコーディングする利点です。
別のインターフェースを使用できます。ICollection<T>消費者が単なる列挙以上のものを求めている場合。
他に何もしない場合は、先に進んでください。特殊なコレクションは、何かをする必要があるコレクションのためのものです... 特別な... こと。
(たとえば、 aは更新時にListViewItemCollection親に通知する必要があるため、 を実装する必要があるため、 を実装する必要があります。カスタム コレクションがある場合は、それを継承する可能性があります。 からのみ継承することは、コレクションを列挙できる場合にのみ意味がありますが、索引付けされていません。)ListViewIList(T)IEnumerable(T)IEnumerable(T)
あなたはできる。
public class List<T> : IList<T>, ICollection<T>,
IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>,
IEnumerable
ここでの混乱の原因は、「カスタム コレクション」と「カスタム クラス インスタンスのコレクション」の違いだと思います。これら2つのうち、あなたList<CustomObject>は後者のケースです。他の誰かが作成したコレクションを再利用しているだけで、ジェネリックを利用してアイテムタイプ情報を保持しています。それだけです。真のカスタム コレクションはおそらく を実装IEnumerable<T>しますが、必要になることはほとんどありません。
したがって、この場合、使用できるだけでなく、おそらく使用する必要がありますList<CustomObject>