如何覆盖列表?

时间:2017-01-15 04:53:37

标签: c# list

我需要与list类似的集合,而不是在达到特定长度时始终添加项目,它应该从第一个索引开始覆盖值并按循环顺序继续。

即。对于4项限制:

specialList.Add(100); // {100}
specialList.Add(101); // {100, 101}
specialList.Add(102); // {100, 101, 102}
specialList.Add(103); // {100, 101, 102, 103}
specialList.Add(104); // {104, 101, 102, 103}
specialList.Add(105); // {104, 105, 102, 103}

2 个答案:

答案 0 :(得分:5)

(更新以显示常规列表类) 这是一个可用于特殊列表类的类,它在到达最后一个元素时循环(循环到第一个项目):

public class ListCycle<T> : IList<T>
{

    int curIndex = -1;
    List<T> list;
    int nMax;

    public ListCycle(int n)
    {
        list = new List<T>(n);
        nMax = n;
    }

    /// <summary>returns the current index we are in the list</summary>
    public int CurIndex { get { return curIndex; } }

    public int IndexOf(T item) { return list.IndexOf(item); }
    public bool Contains(T item) { return list.Contains(item); }
    public int Count { get { return list.Count; } }
    public bool IsReadOnly { get { return false; } }
    public IEnumerator<T> GetEnumerator() { return list.GetEnumerator(); }
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return list.GetEnumerator(); }

    public T this[int index]
    {
        get { return list[index]; }
        set { list[index] = value; }
    }

    public void Add(T item)
    {
        curIndex++; if (curIndex >= nMax) curIndex = 0;
        if (curIndex < list.Count)
            list[curIndex] = item;
        else
            list.Add(item);
    }

    public void Clear()
    {
        list.Clear();
        curIndex = -1;
    }

    //other mehods/properties for IList ...
    public void Insert(int index, T item) { throw new NotImplementedException(); }
    public bool Remove(T item) { throw new NotImplementedException(); }
    public void RemoveAt(int index) { throw new NotImplementedException(); }
    public void CopyTo(T[] array, int arrayIndex) { throw new NotImplementedException(); }

}

用法很简单:

var list = new ListCycle<int>(10);

//fill the list
for (int i = 0; i < 10; i++)
{
    list.Add(i);
}

//now list is:
// 0, 1, 2, 3, ...

//add more items will start from first
list.Add(100); //overrides first item
list.Add(101); //overrides second item

//now list is:
// 100, 101, 2, 3, ...

答案 1 :(得分:4)

为什么不清除list,然后开始添加项目,而不是覆盖list

按照以下方法

清除list

myList.Clear();

然后在list

中添加项目

myList.add(item);

修改

如果您想保留旧值,那么一旦list填充了10个项目,立即在第一个索引处添加项目

myList[0] = (newItem);

newItem会覆盖list

中的第一项