2017-01-15 2 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);

EDIT

Если вы хотите сохранить старые значения , затем один раз в list заполнен 10 пунктов, теперь, чтобы добавить товар в первый индекс

myList[0] = (newItem);

это newItem будет перезаписать первый пункт в вашем list

+0

Возможно, он хочет сохранить старые значения, например, всегда последние 10 элементов. –

+0

@ Юсаф благодарит вас за ответ, но мне нужно сохранить старые значения в списке. – 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 Спасибо за отличный ответ! Я думаю, что многие люди посчитают это полезным. Но мне понравилось простое решение, которое дал Юсаф. – John

+0

Я обновил свой ответ, чтобы определить общий класс специальных списков, который может быть более полезным. я думаю, что ответ вроде 'myList [0] = (newItem);', как это предусмотрено другим пользователем, настолько очевиден и не так прост в использовании на практике .. таким образом вы должны сами отслеживать curIndex –

Смежные вопросы