2017-01-15 73 views
6

我需要與列表類似的集合,而不是總是在達到特定長度時添加項目,它應該開始覆蓋第一個索引中的值並按循環順序繼續。如何覆蓋列表?

I.e. 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} 
+0

你打算怎麼知道要覆蓋哪些值?您可以通過索引('myList [index] = newValue')引用項目,並設置新值 – Alex

+0

是否要保留例如總是最後10個項目?或清除列表是好的? –

+0

@ S.Serp是的,我需要保留最後10個項目。事實證明,列表的長度將限制爲10項,新項目將從頭開始覆蓋舊的開始。 – John

回答

3

而不是覆蓋list的,爲什麼不清除list,然後開始添加物品。

清除您的list通過以下方法

myList.Clear();

,然後添加你的list

myList.add(item);

編輯

項目如果你想保留舊值,那麼一旦list充滿了10個項目,我們在第一個索引

myList[0] = (newItem);

newItem將覆蓋第一項添加的項目您list

+0

也許他想保留舊值,例如總是最後10個項目 –

+0

@Yousaf感謝您的回答,但我需要保持列表中的舊值。 – John

+0

@Yousaf,非常感謝,一切都比我想象的容易。 – John

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, ... 
+0

你給出了很好的答案。 –

+0

@ S.Serp謝謝你的回答!我想很多人會覺得它很有用。但我喜歡Yousaf給出的簡單解決方案。 – John

+0

我更新了我的答案,以定義一個通用的特殊列表類,這可能更有用。我認爲像其他用戶提供的'myList [0] =(newItem);'這樣的答案是如此明顯,並且在實踐中使用起來並不那麼簡單......你必須自己跟蹤curIndex –