2016-10-03 51 views
2

我正在構建一個使用Manatee.Trello包處理Trello API的C#應用​​程序。IEnumerable.MoveNext()返回True,但IEnumerable.Current引發System.NullReferenceException

我目前正在嘗試獲取搜索功能返回的第一個結果。 Search.Boards元素實現了接口IEnumerable<Board>

這是我目前有:

Search mySearch = new Search(SearchFor.IsOpen(), 100, SearchModelType.Boards); 
foreach (Board b in mySearch.Boards) { 
     Console.WriteLine("Board Name:{0} _ ID:{1}", b.Name, b.Id); 
} 
mySearch.Boards.GetEnumerator().Reset(); 
bool next=mySearch.Boards.GetEnumerator().MoveNext(); 
Console.WriteLine("MoveNext:{0}", next); 
Console.WriteLine("\nBoard Name:{0}", mySearch.Boards.GetEnumerator().Current.ToString()); 

第一foreach循環工作正常,並顯示所有我的用戶可以訪問板。 Console.WriteLine("MoveNext:{0}", next)也適用,並顯示MoveNext:True。但是,最後一行返回一個System.NullReferenceException: Object reference not set to an instance of an object

我的代碼有什麼問題?我知道mysearch包含數據(我試圖在MoveNext()調用後複製foreach循環,並且它工作正常)。有沒有更簡單的方法來訪問我的搜索結果的特定元素?

回答

4

GetEnumerator()返回一個新的枚舉器每次調用。無論你認爲自己在打電話時做什麼,你都沒有這樣做。每行後面的結果都會丟失,因爲您不保留枚舉變量。

一般來說,C#是一種高級語言。儘量不要深入到手動循環處理的深處。你的foreach就好了。

要訪問一個枚舉成員foreach循環之外,LinQ將是最簡單的方法:

var board = mySearch.Boards.FirstOrDefault(board => board.Name == "WhatImLookingFor"); 
+0

感謝您的解釋。但是,如何在不使用foreach循環的情況下獲取枚舉數的特定元素? – Aserre

+0

@Aserre我加了一個LinQ的例子。 – nvoigt