C#中的循环列表

时间:2015-11-18 13:53:08

标签: c#

我对C#不太熟悉。我正在尝试建立循环列表,我这样做了:

r,r+,w,w+,a,a+

但现在我想知道:我是否重新发明轮子? C#是否已经为此提供了适当的数据结构?

编辑:如果需要某些背景信息。我有一个游戏菜单,在那里我显示了一系列项目,我希望当我按下“下一个”而我在最后一个时,再次显示第一个项目。

2 个答案:

答案 0 :(得分:9)

利用% (remainder) operator代码变得非常简单:

void nextItem() {
    index++; // increment index
    index %= items.Count; // clip index (turns to 0 if index == items.Count)
    // as a one-liner:
    /* index = (index + 1) % items.Count; */

    setItem();
}

void previousItem() {
    index--; // decrement index
    if(index < 0) {
        index = items.Count - 1; // clip index (sadly, % cannot be used here, because it is NOT a modulus operator)
    }
    // or above code as a one-liner:
    /* index = (items.Count+index-1)%items.Count; */ // (credits to Matthew Watson)

    setItem();
}

答案 1 :(得分:0)

您也可以编写自己的通告列表

public class CircularList<T> : List<T>, IEnumerable<T>
{
    public new IEnumerator<T> GetEnumerator()
    {
        return new CircularEnumerator<T>(this);
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return new CircularEnumerator<T>(this);
    }
}

class CircularEnumerator<T> : IEnumerator<T>
{
    private readonly List<T> list;
    int i = 0;

    public CircularEnumerator(List<T> list){
        this.list = list;
    }

    public T Current => list[i];

    object IEnumerator.Current => this;

    public void Dispose()
    {
        
    }

    public bool MoveNext()
    {
        i = (i + 1) % list.Count;
        return true;
    }

    public void Reset()
    {
        i = 0;
    }
}