2

私はジェネリックについて学ぼうとしており、独自のジェネリック リスト クラスを作成しようとしています。

問題は、default(T); を回避する方法がわからないことです。

    public IEnumerator<T> GetEnumerator()
    {
        T current = data[forIndex];
        while (!current.Equals(default(T)))
        {     
            yield return current;
            forIndex++;
            current = data[forIndex];                
        }
        forIndex = 0;
    }

default(T) は 0 であるため、この構成は、リストに値 0 が含まれている場合、リストの反復処理を停止することを意味します。これを回避する方法を誰か教えてもらえますか?

4

2 に答える 2

1

データを配列に保持していると仮定すると、それを反復して各反復を生成します。

for(int i=0; i < data.Length; ++i)
{
  yield return data[i];
}
于 2012-09-08T14:07:26.547 に答える
0

あなたの間違いは、内部配列には有効なデータ範囲ではなく、最後にデフォルト値しかないという事実に依存していると思います。List<string>この仮定は、任意の要素型で false になる可能性があります (int 型の場合は 0、ref 型の場合は null です。たとえば、null を a に格納できます)。

したがって、このテクニックを使用することはできません。

代わりに、現在のアイテム数を整数フィールドに保持することをお勧めします。そうすれば、イテレータを正しく実装できます。このような:

for(int i=0; i < this.count; ++i) //iterating over this.count elements
  yield return data[i];

(別の回答から取られたいくつかのコード)。

さて、あなたが自分のやり方でやりたいと主張するなら、これを行うことができます:

while (current != null)

これは、 current が T 型で T が制約されていない場合でも機能します。T が値型の場合、条件は常に真です (値型が最初にボックス化され、ボックス化された値が != null であるため)。

于 2012-09-08T14:28:28.547 に答える