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");
Другие вопросы по тегам