Вопрос состоит из двух частей, которые связаны между собой, но не одинаковы. Сначала ответим на вторую часть, теперь, когда у нас есть синтаксис yield и множество (я люблю это слово!) Встроенных опций класса коллекции, которые вы Вы можете очень редко использовать IEnumerator или IEnumerable самостоятельно. Таким образом, в подавляющем большинстве случаев пользовательский класс коллекции не должен реализовывать IEnumerable и сам IEnumerator, он должен быть производным от одного из существующих встроенных классов коллекции, который уже делает это для вас.
Во-вторых, чтобы ответить на первый вопрос, зачем создавать такой пользовательский класс коллекции? для того, чтобы инкапсулировать логику / функциональность, которую вы хотите повторно использовать в нескольких местах в клиентском коде, в одном месте, вместо того, чтобы повторять это везде. Скажем, у вас есть необходимость представлять коллекции счетов. List<Invoice>
сделает это, но если вам нужны только просроченные счета-фактуры в двух или трех местах в одном модуле, и только счета-фактуры за указанное состояние в другом модуле и только конкретный клиент Счета в биллинговом модуле, и, скажем, вам нужно найти и извлечь конкретный счет по его номеру счета в нескольких местах кода. Что ж, если все, что у вас есть, это List<Invoice>
, то все функции, необходимые для выполнения описанного мной, должны повторяться в каждом месте клиентского кода, где вы хотите выполнять эти функции ... Если вы инкапсулируете эту функциональность в пользовательском классе коллекции, вы пишите только один раз, сохраняйте в одном и том же месте и получайте к нему доступ из любого места с помощью методов класса коллекции в экземпляре ...
public Invoices: List<Invoice>
{
public Invoices OverDueInvoices
{ get {return this.Where( i => i.IsOverdue()); } }
public Invoices InvoicesByState(string stateAbbrev)
{ return this.Where( i => i.State == stateAbbrev); }
public Invoice this[int invoiceId]
{ get { return this.Find( i => i.InvoiceId == invoiceId); } }
// extra functionality as required
}