.net 多值字典枚举

dtcbnfnu  于 2023-11-20  发布在  .NET
关注(0)|答案(1)|浏览(101)

我正在尝试用C#自己实现MultiValueDictionary。我在实现IELTS时遇到了问题。
我使用IDictionary<K, HashSet<V>>作为内部结构。我将字典和哈希集的枚举数分配给字段,并尝试遍历它们。问题是:_keysEnum.Current.Value总是null,每次我得到空集合。内部字典包含哈希集中的正确值。

public class MultiValueDictionaryEnumerator<K, V> : IEnumerator<KeyValuePair<K, V>>
{
    private IDictionary<K, HashSet<V>> _dict;
    private IEnumerator<KeyValuePair<K, HashSet<V>>> _keysEnum;
    private HashSet<V>.Enumerator _setEnum;
    private bool _setEnumInit;

    public MultiValueDictionaryEnumerator(IDictionary<K, HashSet<V>> dict)
    {
        _dict = dict;
        Reset();
    }
    public KeyValuePair<K, V> Current => KeyValuePair.Create(_keysEnum.Current.Key, _setEnum.Current);

    object IEnumerator.Current => Current;

    public void Dispose()
    {
    }

    public bool MoveNext()
    {
        var result = false;
        if (_setEnumInit)
        {
            result = _setEnum.MoveNext();
            if (!result)
            {
                result = _keysEnum.MoveNext();
                if (result)
                {
                    _setEnum = _keysEnum.Current.Value.GetEnumerator();
                }
            }
        }

        return result;
    }

    public void Reset()
    {
        _keysEnum = _dict.GetEnumerator();
        if (_keysEnum.Current.Value != null)
        {
            _setEnum = _keysEnum.Current.Value.GetEnumerator();
            _setEnumInit = true;
        }
    }
}

字符串

cyvaqqii

cyvaqqii1#

下面是IEnumerable<T>接口的一个实现,它使用了一个iterator。显式实现IEnumerator<T>接口太麻烦了。

public class MultiValueDictionary<K, V> : IEnumerable<KeyValuePair<K, V>>
{
    private IDictionary<K, HashSet<V>> _dict;

    public IEnumerator<KeyValuePair<K, V>> GetEnumerator()
    {
        foreach (var entry in _dict)
        {
            var hashSet = entry.Value;
            foreach (var item in hashSet)
            {
                yield return new KeyValuePair<K, V>(entry.Key, item);
            }
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }
}

字符串

相关问题