.net 多值字典枚举

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

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

  1. public class MultiValueDictionaryEnumerator<K, V> : IEnumerator<KeyValuePair<K, V>>
  2. {
  3. private IDictionary<K, HashSet<V>> _dict;
  4. private IEnumerator<KeyValuePair<K, HashSet<V>>> _keysEnum;
  5. private HashSet<V>.Enumerator _setEnum;
  6. private bool _setEnumInit;
  7. public MultiValueDictionaryEnumerator(IDictionary<K, HashSet<V>> dict)
  8. {
  9. _dict = dict;
  10. Reset();
  11. }
  12. public KeyValuePair<K, V> Current => KeyValuePair.Create(_keysEnum.Current.Key, _setEnum.Current);
  13. object IEnumerator.Current => Current;
  14. public void Dispose()
  15. {
  16. }
  17. public bool MoveNext()
  18. {
  19. var result = false;
  20. if (_setEnumInit)
  21. {
  22. result = _setEnum.MoveNext();
  23. if (!result)
  24. {
  25. result = _keysEnum.MoveNext();
  26. if (result)
  27. {
  28. _setEnum = _keysEnum.Current.Value.GetEnumerator();
  29. }
  30. }
  31. }
  32. return result;
  33. }
  34. public void Reset()
  35. {
  36. _keysEnum = _dict.GetEnumerator();
  37. if (_keysEnum.Current.Value != null)
  38. {
  39. _setEnum = _keysEnum.Current.Value.GetEnumerator();
  40. _setEnumInit = true;
  41. }
  42. }
  43. }

字符串

cyvaqqii

cyvaqqii1#

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

  1. public class MultiValueDictionary<K, V> : IEnumerable<KeyValuePair<K, V>>
  2. {
  3. private IDictionary<K, HashSet<V>> _dict;
  4. public IEnumerator<KeyValuePair<K, V>> GetEnumerator()
  5. {
  6. foreach (var entry in _dict)
  7. {
  8. var hashSet = entry.Value;
  9. foreach (var item in hashSet)
  10. {
  11. yield return new KeyValuePair<K, V>(entry.Key, item);
  12. }
  13. }
  14. }
  15. IEnumerator IEnumerable.GetEnumerator()
  16. {
  17. return this.GetEnumerator();
  18. }
  19. }

字符串

展开查看全部

相关问题