#c# #winforms
#c# #winforms
Вопрос:
Это, вероятно, простая задача, однако я не могу решить.
Итак, в настоящее время я настроил форму, которая содержит текстовое поле и кнопку, и я хочу иметь возможность нажимать на кнопку, и первое значение в LinkedList будет отображаться в текстовом поле. Если я нажму кнопку еще раз, появится следующее значение и т.д.
В настоящее время я делаю это так, чтобы отображалось первое значение, но затем я не могу перейти к следующему значению.
Это код, который у меня есть на данный момент:
public class Node
{
public string data;
public Node next;
public Node(string newData)
{
data = newData;
next = null;
}
public void AddEnd(string data)
{
if (next == null)
{
next = new Node(data);
}
else
{
next.AddEnd(data);
}
}
}
public class myList
{
public void AddEnd(string data)
{
if (headnode == null)
{
headnode = new Node(data);
}
else
{
headnode.AddEnd(data);
}
}
public string getFirst() // this gets the first value within the list and returns it
{
if (headnode == null)
{
throw new Exception("List is empty");
}
Node node = headnode;
while (node.next != null)
{
node = node.next;
}
return node.data;
}
Я также пытался использовать это:
public class NavigationList<T> : List<T>
{
private int _currentIndex = -1;
public int CurrentIndex
{
get
{
if (_currentIndex == Count)
_currentIndex = 0;
else if (_currentIndex > Count - 1)
_currentIndex = Count - 1;
else if (_currentIndex < 0)
_currentIndex = 0;
return _currentIndex;
}
set { _currentIndex = value; }
}
public T MoveNext
{
get { _currentIndex ; return this[CurrentIndex]; }
}
public T Current
{
get { return this[CurrentIndex]; }
}
}
Однако я не совсем знаком с чем-то подобным, поэтому я не был уверен, как это использовать.
Ответ №1:
Итак, у вас есть последовательность элементов, и единственное, что вы хотите, это получить первый элемент, и как только вы получите элемент, каждый раз, когда вы запрашиваете его, вы хотите следующий элемент, пока не останется больше элементов.
В .NET
это называется an IEnumerable
, или, если вы знаете, какие элементы находятся в вашей последовательности, например элементы из MyClass
, это называется an IEnumerable<MyClass>
. В вашем случае вам нужен IEnumerable<string>
.
К счастью, .NET
загружен классами, которые реализуют IEnumerable
. Два из наиболее используемых — array и list. Вам редко приходится самостоятельно создавать перечислимый класс, повторно использовать существующие и выполнять перечисление поверх него.
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;
}
Комментарии:
1. Спасибо за ваш ответ, однако я не могу использовать это, поскольку в настоящее время я в школе, поэтому, как только я вернусь домой, я свяжусь с вами, чтобы посмотреть, работает ли это.