1

IEnumerableはカスタムコレクションで使用されると言われています。用途の1つは、カスタムコレクションをトラバースするために使用されるforeachループです。

ただし、私の質問は、最初に実装するカスタムコレクションを作成してから、カスタムオブジェクトのグループを格納するIEnumerableために実装する別のクラスを構築する代わりにIEnumerator、なぜ単にを使用できないのかということlist<your_customer_object>です。

助けてくれてありがとう。

4

9 に答える 9

3

別のデータ構造を実装したい場合があるためです。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; }
        }
    }
}
于 2012-12-21T15:22:31.757 に答える
1

もちろん使えますList<T>

ニーズに合う場合List<T>は、それを使用し、から継承する新しいクラスを作成しないでくださいIEnumerable<T>

于 2012-12-21T15:21:57.380 に答える
1

IEnumerable<T>ニーズに合わない場合は、独自の実装を提供List<T>します。この標準的な例は、コレクションの遅延評価をサポートしたい場合です。おそらく を使用するメソッドを使用しますyield return

于 2012-12-21T15:23:31.460 に答える
1

@ 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 のコレクションの最も抽象化されたものであり、この抽象化で対話することができます。

于 2012-12-21T15:33:22.517 に答える
0

List<T>またはその他のジェネリック コレクション型を使用できます。やっぱりList<T>実装IEnumerable<T>

オーダーメイドのコレクションでカバーする必要がある特定のエッジ ケースはありますか?

于 2012-12-21T15:22:12.577 に答える
0

もちろん、メンバーを として定義することもできますがList<T>、それはクラスの顧客を特定の実装にバインドします。メンバーを次のように定義するとIEnumerable<T>(コンシューマーがコレクションの列挙のみを希望すると仮定して)、契約を破ることなく、インターフェイスを実装する別のコレクション タイプに実装を変更できます。List<T>実装順序を からに変更してもSortedSet<T>、消費者は影響を受けません。

基本的には、具象型ではなくインターフェースに対してコーディングする利点です。

別のインターフェースを使用できます。ICollection<T>消費者が単なる列挙以上のものを求めている場合。

于 2012-12-21T15:22:24.743 に答える
0

他に何もしない場合は、先に進んでください。特殊なコレクションは、何かをする必要があるコレクションのためのものです... 特別な... こと。

(たとえば、 aは更新時にListViewItemCollection親に通知する必要があるため、 を実装する必要があるため、 を実装する必要があります。カスタム コレクションがある場合は、それを継承する可能性があります。 からのみ継承することは、コレクションを列挙できる場合にのみ意味がありますが、索引付けされていません。)ListViewIList(T)IEnumerable(T)IEnumerable(T)

于 2012-12-21T15:22:51.280 に答える
0

あなたはできる。

public class List<T> : IList<T>, ICollection<T>, 
IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, 
IEnumerable 
于 2012-12-21T15:23:34.463 に答える
0

ここでの混乱の原因は、「カスタム コレクション」と「カスタム クラス インスタンスのコレクション」の違いだと思います。これら2つのうち、あなたList<CustomObject>は後者のケースです。他の誰かが作成したコレクションを再利用しているだけで、ジェネリックを利用してアイテムタイプ情報を保持しています。それだけです。真のカスタム コレクションはおそらく を実装IEnumerable<T>しますが、必要になることはほとんどありません。

したがって、この場合、使用できるだけでなく、おそらく使用する必要がありますList<CustomObject>

于 2012-12-21T15:24:04.130 に答える