为C#自定义固定大小哈希表实现指定功能的迭代器
问题
需要为自定义的固定大小Hashtable类实现一个迭代器,数据存储在LinkedList<HashTableNode<T1, T2>>数组中。现有代码框架如下:
class HashTableNode<T1, T2> { public T1 Key { get; set; } public T2 Value { get; set; } } class HashTableClass<T1, T2> { public LinkedList<HashTableNode<T1, T2>>[] elements; const int defaultSize = 10000; public HashTableIterator<T1, T2> GetIterator() { return new HashTableIterator<T1, T2>(this); } } class HashTableIterator<T1, T2> { //need to implement this }
该迭代器需具备以下功能:
HasNext():判断当前迭代器位置是否存在元素Current:返回当前迭代器位置存储的值MoveNext():将迭代器移动到下一个位置
迭代器的使用示例如下:
HashTableClass<int, string> hashtable = new HashTableClass<int, string>(); //Iterator will be used like this HashTableIterator<int, string> iterator = hashtable.GetIterator(); while(iterator.HasNext()) { Console.Write(iterator.Current); iterator.MoveNext(); }
请完成HashTableIterator类的实现。
解决方案
以下是完整的HashTableIterator实现,核心逻辑是跟踪当前遍历的数组索引和链表节点,逐个遍历数组中的非空链表及其内部节点:
using System; using System.Collections.Generic; class HashTableIterator<T1, T2> { private readonly HashTableClass<T1, T2> _hashTable; private int _currentArrayIndex; private LinkedListNode<HashTableNode<T1, T2>> _currentListNode; public HashTableIterator(HashTableClass<T1, T2> hashTable) { _hashTable = hashTable ?? throw new ArgumentNullException(nameof(hashTable)); _currentArrayIndex = -1; _currentListNode = null; // 初始化时直接定位到第一个有效元素 MoveNext(); } public bool HasNext() { // 检查当前链表是否还有后续节点 if (_currentListNode?.Next != null) return true; // 遍历数组剩余部分,判断是否存在未处理的非空链表 for (int i = _currentArrayIndex + 1; i < _hashTable.elements.Length; i++) { if (_hashTable.elements[i] != null && _hashTable.elements[i].Count > 0) return true; } return false; } public HashTableNode<T1, T2> Current { get { if (_currentListNode == null) throw new InvalidOperationException("迭代器已超出元素范围"); return _currentListNode.Value; } } public void MoveNext() { // 优先遍历当前链表的下一个节点 if (_currentListNode?.Next != null) { _currentListNode = _currentListNode.Next; return; } // 当前链表遍历完毕,寻找数组中下一个非空链表 _currentArrayIndex++; while (_currentArrayIndex < _hashTable.elements.Length) { var targetList = _hashTable.elements[_currentArrayIndex]; if (targetList != null && targetList.Count > 0) { _currentListNode = targetList.First; return; } _currentArrayIndex++; } // 所有元素遍历完成 _currentListNode = null; } }
补充说明
- 构造函数中直接调用
MoveNext(),确保迭代器初始化后就指向第一个有效元素,符合使用示例的逻辑 Current属性增加了空值校验,避免非法调用时抛出空引用异常- 如果需要让
Current直接返回Value而非整个HashTableNode,可修改返回类型为T2,并返回_currentListNode.Value.Value
内容的提问来源于stack exchange,提问作者DK_bhai
相关产品推荐
相关产品推荐

