我需要为我的自定义固定大小的哈希表类提供一个迭代器,我正在存储数据一个链表数组。
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);
}