如何在IDictionary中实现“IDictionaryEnumerator GetEnumerator()”方法?

时间:2015-03-16 19:06:32

标签: c# dictionary enumeration

我正在创建一个实现IDictionary接口的字典数据结构。在实施GetEnumerator方法时,我陷入了困境。我有一个枚举器,它给出了KeyValuePair实例,但是从我发现的内容来看,我必须实现IDictionaryEnumerator。

有没有一种简单的方法可以将KeyValuePair枚举器转换为IDictionaryEnumerator?我知道我可以做以下黑客攻击:

IDictionaryEnumerator GetEnumerator()
{
    return new Dictionary(this.KeyValueEnumerator()).GetEnumerator();
}

但它加载所有枚举数据似乎非常低效。

1 个答案:

答案 0 :(得分:0)

鉴于您告诉我们您的KeyValueEnumerator()返回IEnumerator<KeyValuePair<,>>

// This you told us you have
public IEnumerator<KeyValuePair<TKey, TValue>> KeyValueEnumerator()
{
    return something;
}

我构建了一个公开MyDictionaryEnumerator接口

IDictionaryEnumerator
// This is what you need
public IDictionaryEnumerator GetEnumerator()
{
    return new MyDictionaryEnumerator(KeyValueEnumerator());
}

public class MyDictionaryEnumerator : IDictionaryEnumerator
{
    public MyDictionaryEnumerator(IEnumerator<KeyValuePair<TKey, TValue>> enumerator)
    {
        Enumerator = enumerator;
    }

    public IEnumerator<KeyValuePair<TKey, TValue>> Enumerator;

    public DictionaryEntry Entry
    {
        get { return new DictionaryEntry(Enumerator.Current.Key, Enumerator.Current.Value); }
    }

    public object Key
    {
        get { return Enumerator.Current.Key; }
    }

    public object Value
    {
        get { return Enumerator.Current.Value; }
    }

    public object Current
    {
        get { return Entry; }
    }

    public bool MoveNext()
    {
        return Enumerator.MoveNext();
    }

    public void Reset()
    {
        Enumerator.Reset();
    }
}

MyDictionaryEnumerator是一个非常简单的类,它围绕KeyValueEnumerator()来回建立DictionaryEntry个对象和/或KeyValue(我我会说它是Adapter Pattern

的实现