2012-03-27 22 views

Odpowiedz

64

Spróbuj użyć

collection.Insert(0, item); 

Byłoby dodać pozycję do początku zbierania (podczas dodawania dodaje do końca). Więcej informacji here.

5

Zamiast tego należy użyć stosu.

ta opiera się na Observable Stack and Queue

Załóż zaobserwowania stos, gdzie stos jest zawsze ostatni w pierwszym out (LIFO).

od Sascha Holl

public class ObservableStack<T> : Stack<T>, INotifyCollectionChanged, INotifyPropertyChanged 
{ 
    public ObservableStack() 
    { 
    } 

    public ObservableStack(IEnumerable<T> collection) 
    { 
     foreach (var item in collection) 
      base.Push(item); 
    } 

    public ObservableStack(List<T> list) 
    { 
     foreach (var item in list) 
      base.Push(item); 
    } 


    public new virtual void Clear() 
    { 
     base.Clear(); 
     this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); 
    } 

    public new virtual T Pop() 
    { 
     var item = base.Pop(); 
     this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, item)); 
     return item; 
    } 

    public new virtual void Push(T item) 
    { 
     base.Push(item); 
     this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item)); 
    } 


    public virtual event NotifyCollectionChangedEventHandler CollectionChanged; 


    protected virtual void OnCollectionChanged(NotifyCollectionChangedEventArgs e) 
    { 
     this.RaiseCollectionChanged(e); 
    } 

    protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) 
    { 
     this.RaisePropertyChanged(e); 
    } 


    protected virtual event PropertyChangedEventHandler PropertyChanged; 


    private void RaiseCollectionChanged(NotifyCollectionChangedEventArgs e) 
    { 
     if (this.CollectionChanged != null) 
      this.CollectionChanged(this, e); 
    } 

    private void RaisePropertyChanged(PropertyChangedEventArgs e) 
    { 
     if (this.PropertyChanged != null) 
      this.PropertyChanged(this, e); 
    } 


    event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged 
    { 
     add { this.PropertyChanged += value; } 
     remove { this.PropertyChanged -= value; } 
    } 
} 

Wymaga INotifyCollectionChanged, robi to samo jako ObservableCollection, ale w sposób stosu.

+0

Dlaczego potrzebuje stosu? Czy nie może po prostu ".Wstawić (0, przedmiot)" jakieś nowe pozycje na początku listy? – ANeves

+1

@Neves, ponieważ wspomniana wstawka jest wykonywana w czasie O (n), więc może to być droga wstawka. – mslot

+0

@mslot jeśli to jest powód, powinien znajdować się w odpowiedzi. – ANeves

0

można spróbować to

collection.insert(0,collection.ElementAt(collection.Count - 1));

Powiązane problemy