我对C#不太熟悉。我正在尝试建立循环列表,我这样做了:
r,r+,w,w+,a,a+
但现在我想知道:我是否重新发明轮子? C#是否已经为此提供了适当的数据结构?
编辑:如果需要某些背景信息。我有一个游戏菜单,在那里我显示了一系列项目,我希望当我按下“下一个”而我在最后一个时,再次显示第一个项目。
答案 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;
}
}