通过单击按钮,可以显示“链接列表”中的下一个值

时间:2019-03-18 20:13:59

标签: 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 个答案:

答案 0 :(得分:0)

因此,您有一系列的项目,而您唯一想要的就是获取第一个项目,一旦获得一个项目,每次要它时,您都想要下一个项目,直到出现为止没有其他物品了。

.NET中,这称为IEnumerable,或者如果您知道序列中有哪些项目,例如MyClass的项目,则称为{{1} }。根据您的情况,您需要一个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;
}

您的ButtonClick事件处理程序:

string GetNextItemToDisplay()
{
     if (this.myEnumerator == null) this.myEnumerator = this.myData.GetEnumerator();
     while (this.myEnumerator.MoveNext())
          return enumerator.Current();
     return null;
}

如果您想从第一个元素重新开始,例如在更改列表之后

void OnButtonClick(object sender, eventArgs e)
{
     string nextItemToDisplay = this.GetNextItemToDisplay();
     if (nextItemToDisplay != null)
        this.Display(nextItemToDisplay);
     else
        this.DisplayNoMoreItems():
}