12

オブジェクトをオブジェクトにマップするクラスがありますが、辞書とは異なり、両方の方法でマップします。IEnumerator現在、値を反復処理するカスタムインターフェイスを実装しようとしています。

public class Mapper<K,T> : IEnumerable<T>, IEnumerator<T>

{
    C5.TreeDictionary<K,T> KToTMap = new TreeDictionary<K,T>();
    C5.HashDictionary<T,K> TToKMap = new HashDictionary<T,K>();

    public void Add(K key, T value)
    {
        KToTMap.Add(key, value);
        TToKMap.Add(value, key);

    }

    public int Count
    {
        get { return KToTMap.Count; }
    }
    

    public K this[T obj]
    {
        get
        {
            return TToKMap[obj];
        }
    }

    public T this[K obj]
    {
        get
        {
            return KToTMap[obj];
        }
    }

    public IEnumerator<T> GetEnumerator()
    {
        return KToTMap.Values.GetEnumerator();
    }

    public T Current
    {
        get { throw new NotImplementedException(); }
    }

    public void Dispose()
    {
        throw new NotImplementedException();
    }

    object System.Collections.IEnumerator.Current
    {
        get { throw new NotImplementedException(); }
    }

    public bool MoveNext()
    {
        ;
    }

    public void Reset()
    {
        throw new NotImplementedException();
    }
}
4

5 に答える 5

19

まず、コレクションオブジェクトにIEnumerator<>を実装させないでください。これはバグにつながります。(2つのスレッドが同じコレクションに対して反復している状況を考慮してください)。

列挙子を正しく実装することは簡単ではないことが判明したため、C#2.0は、「yield return」ステートメントに基づいて、それを実行するための特別な言語サポートを追加しました。

Raymond Chenの最近の一連のブログ投稿(「C#でのイテレーターの実装とその結果」)は、理解を深めるのに適した場所です。

于 2008-09-10T13:23:34.820 に答える
9

IEnumerable<T>インターフェイスを実装するだけです。IEnumerator<T>列挙子で特別なことをしたい場合を除いて、実装する必要はありません。あなたの場合は必要ないようです。

public class Mapper<K,T> : IEnumerable<T> {
    public IEnumerator<T> GetEnumerator()
    {
        return KToTMap.Values.GetEnumerator();
    }
}

以上です。

于 2008-09-10T13:12:34.440 に答える
6

CreateEnumerable()IEnumerable実装する を返しますGetEnumerator()

public class EasyEnumerable : IEnumerable<int> {

    IEnumerable<int> CreateEnumerable() {
        yield return 123;
        yield return 456;
        for (int i = 0; i < 6; i++) {
            yield return i;
        }//for
    }//method

    public IEnumerator<int> GetEnumerator() {
        return CreateEnumerable().GetEnumerator();
    }//method

    IEnumerator IEnumerable.GetEnumerator() {
        return CreateEnumerable().GetEnumerator();
    }//method

}//class
于 2013-02-21T10:22:03.577 に答える
4

イールドリターンを使用します。

C#で使用されるyieldキーワードは何ですか?

于 2008-09-10T13:08:30.707 に答える