Итак, у вас есть последовательность предметов, и единственное, что вам нужно, это получить первый предмет, и как только вы получаете предмет, каждый раз, когда вы его запрашиваете, вы хотите следующий предмет, пока больше ничего не осталось.
В .NET
это называется IEnumerable
, или, если вы знаете, какие элементы находятся в вашей последовательности, например, элементы MyClass
, это называется IEnumerable<MyClass>
. В вашем случае вам нужен IEnumerable<string>
.
К счастью .NET
загружен классами, которые реализуют IEnumerable
. Два из наиболее часто используемых - массив и список. Вам редко приходится создавать перечислимый класс самостоятельно, повторно использовать существующие и перечислять его.
List<string> myData = ... // fill this list somehow.
IEnumerator<string> myEnumerator = null // we are not enumerating yet.
string GetNextItemToDisplay()
{ // returns null if there are no more items to display
// if we haven't started yet, get the enumerator:
if (this.myEnumerator == null) this.myEnumerator = this.myData.GetEnumerator();
// get the next element (or if we haven't fetched anything yet: get the first element
// for this we use MoveNext. This returns false if there is no next element
while (this.myEnumerator.MoveNext())
{
// There is a next string. It is in Current:
string nextString = enumerator.Current();
return nextString;
}
// if here: no strings left. return null:
return null;
}
Это выглядит как много кода, но если вы удалите комментарии, это всего лишь несколько строк кода:
string GetNextItemToDisplay()
{
if (this.myEnumerator == null) this.myEnumerator = this.myData.GetEnumerator();
while (this.myEnumerator.MoveNext())
return enumerator.Current();
return null;
}
Ваш обработчик событий ButtonClick:
void OnButtonClick(object sender, eventArgs e)
{
string nextItemToDisplay = this.GetNextItemToDisplay();
if (nextItemToDisplay != null)
this.Display(nextItemToDisplay);
else
this.DisplayNoMoreItems():
}
Если вы хотите начать заново с первого элемента, например, после изменения списка
void RestartEnumeration()
{
this.myEnumerator = null;
}