我有一个dctionary,我正在调用.GetEnumerator();并将其分配给变量。然后我使用新分配的变量来访问我的字典并更改值。但它是null并且给我一个NullException消息。请参阅以下代码:
这是我的词典创建方式
public Dictionary<Tuple<int, int>, string> GenerateTable(int _x, int _y)
{
int total = _x * _y;
var grid = new Dictionary<Tuple<int, int>, string>(); //!Might need this later!
for (int i = 1; i <= _x; i++) // outer loop is column
{
for (int ii = 1; ii <= _y; ii++) // Inner loop is row -
{
grid.Add(Tuple.Create(i, ii), "O");
}
}
return grid; // Should have same amount of elements as int total
}
这是我调用.GetEnumerator
的代码 public void ClearTable(Dictionary<Tuple<int, int>, string> _table)
{
var e = _table.GetEnumerator();
_table[e.Current.Key] = "O";
}
我在这里得到一个空引用
_table[e.Current.Key] = "O";
我确信此代码之前正在运行,但也许我已将其更改。有没有人有任何想法?
答案 0 :(得分:12)
枚举器在枚举的第一个元素之前启动一个。在访问MoveNext
之前,您需要先致电Current
。
如果MoveNext
返回true,则枚举为非空,枚举数现在指向第一个元素。
如果MoveNext
返回false,则可枚举为空,您无法访问Current
。
IEnumerator<int> e = Enumerable.Range(4, 2).GetEnumerator();
// You may not access Current here! Enumerator is one before first element.
e.MoveNext(); //returns true
e.Current; //returns 4
e.MoveNext(); //returns true
e.Current; //returns 5
e.MoveNext(); //returns false
// You may not access Current here! Enumerator is one after last element.