2010-10-19 10 views
18

Mam następujący kod do ponownego zamówić ObservableCollection<T> kolekcja:Zamów ObservableCollection <T> bez tworzenia nowej jeden

list = new ObservableCollection<SomeType>(list.OrderBy(c=>c.Ordinal)); 

Ten kod działa, ale nie podoba mi się fakt, że „nowy” jest zaangażowana. Czy istnieje sposób, aby zmienić kolejność elementów wewnętrznych kolekcji ObservableCollection<T> bez tworzenia nowej?

Dzięki,

+0

Bardzo skomplikowane podejście jest dostępne [tutaj] (http://stackoverflow.com/questions/996126/sorting-an-observable-collection-with-linq). –

Odpowiedz

9

zważywszy że OrderBy również aktualności się tablicą, aby dopasować wielkość swojej kolekcji i kilka innych obiektów, masz dwie możliwości:

  1. Poddaj się LINQ Zamów całkowicie i napisz swój własny sort, który przeprowadzi sortowanie w miejscu nad ObservableCollection za pomocą metody Move.
  2. Poczekaj, aż bieżąca realizacja staje się problematyczne, a następnie zastosować 1.

Nie martw się, newing rzeczy się nie jest tak straszna. Linq robi to cały czas. O ile nie jest to wąskie gardło, wszystko jest w porządku. O ile nie ma przekonujących dowodów, że sortowanie na miejscu naprawdę przyspieszy przedstawienie, to nie ma problemu.

+0

Zwłaszcza, że ​​same przedmioty nie są nowe, a jedynie kolekcja zawierająca. Zmiana obiektu kolekcji spowoduje również powiązania INPC, aby odświeżyć i pokazać nowe zamówienie. – Monstieur

+4

Problem z tym, że stracisz obserwatora w obserwowalnej kolekcji. – TopinFrassi

+0

Istnieje kilka klientów (np. Aplikacje Sklepu Windows), które animują usunięte lub przeniesione elementy w ObservableCollection, wykorzystując zdarzenia (utworzone, przeniesione, usunięte itp.). Odtworzenie ObservableCollection jest bezcelowe! –

4

O ile mogę powiedzieć, ObservableCollection ma metodę przenoszenia elementów wewnątrz kolekcji. Powinieneś dostać comparer dla typu T, a następnie korzystać z niektórych algorytm sortowania

8

Wdrożenie niestandardową metodę rozszerzenia sortowania kolekcji obserwowalnych

public static class ObservableCollection 
{ 
     public static void Sort<TSource, TKey>(this ObservableCollection<TSource> source, Func<TSource, TKey> keySelector) 
     { 
      List<TSource> sortedList = source.OrderBy(keySelector).ToList(); 
      source.Clear(); 
      foreach (var sortedItem in sortedList) 
      { 
       source.Add(sortedItem); 
      } 
    } 
} 

powyższa odpowiedź jest inspirowana post pana Jaider do tego question

4

Moja odpowiedź jest inspirowana przez bkk

public static class ObservableCollection 
    { 
     public static void Sort<TSource, TKey>(this ObservableCollection<TSource> source, Func<TSource, TKey> keySelector, bool isAZ) 
     { 
      if (isAZ) 
      { 
       List<TSource> sortedList = source.OrderBy(keySelector).ToList(); 
       source.Clear(); 
       foreach (var sortedItem in sortedList) 
       { 
        source.Add(sortedItem); 
       } 
      } 
      else 
      { 
       List<TSource> sortedList = source.OrderByDescending(keySelector).ToList(); 
       source.Clear(); 
       foreach (var sortedItem in sortedList) 
       { 
        source.Add(sortedItem); 
       } 
      }   
     } 
    } 

Użycie

_someObservableCollection.Sort(x => x.Number, false); // Where number is an simple property (non-onject) 
+1

'isAZ' nie jest bardzo intuicyjny, ale jest to poprawa w stosunku do odpowiedzi @ bkk. +1 –

Powiązane problemy