2017-01-15 9 views
6

Potrzebuję kolekcji podobnej do listy, zamiast zawsze dodawać elementy po osiągnięciu określonej długości, należy zacząć zastępować wartości z pierwszego indeksu i kontynuować w kolejności cyklicznej.Jak zastąpić listę?

tj. dla 4 pozycji ograniczenia:

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

Jak się dowiedzieć, jakie wartości należy nadpisać? Możesz odwoływać się do pozycji według indeksu ('myList [index] = newValue') i ustawić nową wartość – Alex

+0

czy chcesz zachować na przykład zawsze 10 ostatnich pozycji? czy wyczyszczenie listy jest w porządku? –

+0

@ S.Serp tak, muszę zachować ostatnie 10 pozycji. Okazuje się, że długość listy będzie ograniczona do 10 pozycji, a nowe elementy będą nadpisywać starą od początku. – John

Odpowiedz

3

Zamiast nadpisywania list, dlaczego nie wystarczy wyczyścić list a następnie rozpocząć dodawanie elementów.

wyczyścić list przez następującą metodę

myList.Clear();

a następnie dodać elementy w swojej list

myList.add(item);

EDIT

Jeśli chcesz zachować stare wartości , następnie raz list wypełniona jest 10 pozycji, teraz, aby dodać element na pierwszy indeks

myList[0] = (newItem);

to newItem zastąpi pierwszą pozycję w swojej list

+0

Może chce zachować stare wartości, na przykład zawsze ostatnie 10 pozycji. –

+0

@Youz podziękować za odpowiedź, ale muszę zachować stare wartości na liście. – John

+0

@Yousaf, Dziękuję bardzo, wszystko było łatwiejsze niż myślałem. – John

5

(Aktualizacja pokazać ogólną klasę listy) to jest klasa, które mogłyby być wykorzystane do klasy specjalnej liście, że pętle (cykle do pierwszego elementu) gdy osiągnięta do ostatniego elementu:

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(); } 

} 

Użycie jest łatwe, ponieważ:

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

dajesz dobrą odpowiedź. –

+0

@ S.Serp Dziękuję za wspaniałą odpowiedź! Myślę, że wiele osób uzna to za przydatne. Ale spodobało mi się proste rozwiązanie, które dał Yousaf. – John

+0

zaktualizowałem swoją odpowiedź, aby zdefiniować ogólną listę specjalną, która może być bardziej przydatna. Myślę, że odpowiedź taka jak 'myList [0] = (newItem);' dostarczona przez innego użytkownika jest tak oczywista i nie tak łatwa w użyciu w praktyce .. w ten sposób musisz samodzielnie śledzić curIndex –