Иметь возможность отображать следующее значение в связанном списке нажатием кнопки

#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. Спасибо за ваш ответ, однако я не могу использовать это, поскольку в настоящее время я в школе, поэтому, как только я вернусь домой, я свяжусь с вами, чтобы посмотреть, работает ли это.