You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为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;
    }
}

补充说明

  1. 构造函数中直接调用MoveNext(),确保迭代器初始化后就指向第一个有效元素,符合使用示例的逻辑
  2. Current属性增加了空值校验,避免非法调用时抛出空引用异常
  3. 如果需要让Current直接返回Value而非整个HashTableNode,可修改返回类型为T2,并返回_currentListNode.Value.Value

内容的提问来源于stack exchange,提问作者DK_bhai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 10:37:14