IEnumerable.MoveNext() возвращает True, но IEnumerable.Current вызывает исключение System.NullReferenceException
Я создаю приложение на C# с использованием пакета Manatee.Trello для обработки API Trello.
В настоящее время я пытаюсь получить первый результат, возвращаемый функцией поиска. 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
содержит данные (я пытался скопировать foreach
цикл сразу после MoveNext()
позвони, и все отлично работает). Есть ли более простой способ получить доступ к определенному элементу моего результата поиска?
1 ответ
GetEnumerator()
возвращает новый перечислитель при каждом вызове. Что бы вы ни думали, что делаете с вызовами, вы этого не делаете. Результат теряется после каждой строки, потому что вы не сохраняете переменную перечислителя.
Вообще говоря, C# - это язык высокого уровня. Старайтесь не опускаться до глубины ручной обработки петель. Ваш foreach
просто отлично.
Чтобы получить доступ к членам перечисления вне цикла foreach, LinQ - самый простой способ:
var board = mySearch.Boards.FirstOrDefault(board => board.Name == "WhatImLookingFor");