2010-10-19 4 views
18

Schaffung Ich habe folgenden Code erneut um eine ObservableCollection<T> Sammlung:Bestellen Sie ein ObservableCollection <T> ohne einen neuen

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

Dieser Code funktioniert, aber ich weiß nicht, wie die Tatsache, dass „neue“ beteiligt ist. Gibt es eine Möglichkeit, die interne Element-Reihenfolge einer ObservableCollection<T> Sammlung zu ändern, ohne eine neue zu erstellen?

Danke,

+0

Ein sehr komplizierter Ansatz ist verfügbar [hier] (http://stackoverflow.com/questions/996126/sorting-an-observable-collection-with-linq). –

Antwort

9

Da OrderBy auch Nachrichten auf ein Array verwenden, um die Größe der Sammlung zu entsprechen, und einige andere Objekte, haben Sie zwei Möglichkeiten:

  1. Geben Sie LINQ OrderBy vollständig auf und schreiben Sie Ihre eigene Sortierung, die die In-Place-Sortierung über Ihre ObservableCollection mithilfe der Move-Methode durchführt.
  2. Warten Sie, bis die aktuelle Implementierung anwenden problematisch wird dann 1.

Keine Sorge newing Zeug nicht so schrecklich ist nicht. Linq macht es die ganze Zeit. Wenn es kein Flaschenhals ist, ist alles gut. Wenn es keine überzeugenden Beweise gibt, dass das Sortieren vor Ort die Show wirklich beschleunigen wird, dann gibt es hier kein Problem.

+0

Besonders, da die Elemente selbst nicht neu sind, sondern nur die enthaltene Sammlung. Durch das Ändern des Sammlungsobjekts werden auch die INPC-Bindungen aktualisiert und die neue Reihenfolge angezeigt. – Monstieur

+4

Das Problem dabei ist, dass Sie jeden Beobachter auf der beobachtbaren Sammlung verlieren. – TopinFrassi

+0

Es gibt einige Clients (z. B. Windows Store-Apps), die gelöschte oder verschobene Objekte in einer ObservableCollection mithilfe der Ereignisse (erstellt, verschoben, entfernt usw.) animieren. Die ObservableCollection neu erstellen ist sinnlos! –

4

Soweit ich das beurteilen kann, hat ObservableCollection Verfahren für Elemente in der Sammlung zu bewegen. Sie sollten einen Vergleich für Ihre T-Typ erhalten, und dann einige Sortieralgorithmus

8

Methode, um Ihre benutzerdefinierte Sortierung Erweiterung implementieren für beobachtbare Sammlung

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

Above Antwort wird von Herrn Jaider Antwort auf diese question

4

inspiriert Meine Antwort von bkk

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

Verwendung

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

'isAZ' ist nicht sehr intuitiv, aber das ist eine Verbesserung von @bkks Antwort. +1 –

Verwandte Themen