Skip to main content
 首页 » 编程设计

c#之Enumerator.Current 为空但集合有数据。我究竟做错了什么

2024年01月13日30findumars

我有一个字典,我正在调用 .GetEnumerator();并将其分配给一个变量。然后我使用新分配的变量来访问我的字典并更改值。但是它是空的,并且给我一个 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"; 

我确信这段代码之前是有效的,但也许我改变了它。有人有什么想法吗?

请您参考如下方法:

枚举器在可枚举的第一个元素之前开始。在访问 Current 之前,您需要先调用 MoveNext。

  • 如果 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.