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(), и он отлично работает). Есть ли более простой способ доступа к определенному элементу результатов поиска?


person Aserre    schedule 03.10.2016    source источник


Ответы (1)


GetEnumerator() возвращает новый счетчик при каждом вызове. Что бы вы ни думали, что делаете с обращениями к нему, вы этого не делаете. Результат теряется после каждой строки, потому что вы не сохраняете переменную перечислителя.

Вообще говоря, C# — это язык высокого уровня. Старайтесь не опускаться до глубины ручной обработки циклов. Ваш foreach в порядке.

Чтобы получить доступ к членам перечисления вне цикла foreach, LinQ — это самый простой способ:

var board = mySearch.Boards.FirstOrDefault(board => board.Name == "WhatImLookingFor");
person nvoigt    schedule 03.10.2016
comment
Спасибо за объяснение. Однако как я могу получить определенный элемент моего перечислителя без использования цикла foreach? - person Aserre; 03.10.2016
comment
@Aserre Я добавил пример LinQ. - person nvoigt; 03.10.2016