c#自定义哈希表的迭代器



我需要为我的自定义固定大小的哈希表类提供一个迭代器,我正在存储数据一个链表数组。

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();
}

. net中有标准的IEnumerable模式。最好还是继续使用这个实现。如果只想公开值,可以执行以下操作

public class HashTableNode<T1, T2>
{
public T1 Key { get; set; }
public T2 Value { get; set; }
}
public class HashTableClass<T1, T2>: IEnumerable<T2>
{
public LinkedList<HashTableNode<T1, T2>>[] elements;
const int defaultSize = 10000;
public IEnumerator<T2> GetEnumerator()
{
return elements.SelectMany(l => l).Select(e => e.Value).GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}

或者你可以引入返回IEnumerable

的方法
public IEnumerable<T2> GetValues()
{
return elements.SelectMany(l => l).Select(e => e.Value);
}

或使用yield return

public IEnumerable<T2> GetValues()
{
foreach (var list in elements)
{
foreach (var node in list)
yield return node.Value;
}
}

在所有情况下,您都可以对您的集合使用foreach:

var hashTable = ...
foreach (var value in hashTable)
{
...
}
foreach (var value in hashTable.GetValues())
{
...
}

如果你想获得"iterator"在。net中叫做IEnumerator,你可以调用IEnumerable.GetEnumerator()

using var enumerator = hashTable.GetEnumerator();
// or
using var enumerator = hashTable.GetValues().GetEnumerator();
while (enumerator.MoveNext())
{
Console.Write(enumerator.Current);
}

最新更新