Manchmal ist es nötig eine ObservableCollection<T> zu sortieren. Dafür kann man in vielen Fällen einfach mit der LINQ-Methode OrderBy die Liste sortieren und anschließend eine neue Collection erstellen:
collection = new ObservableCollection<string>(collection.OrderBy(x => x.Length));
Das Problem dabei ist, dass wenn die Liste gebunden ist, durch das neu erstellen ein Eventhandler für CollectionChanged nicht mehr ausgelöst wird. Besonders Problematisch ist es bei gebundenen Listen, wo man die Bindung neu erstellen müsste.
Dieses Snippet implementiert eine Sortiermethode für ObservableCollection<T>, welche keine neuerstellung der Collection benötigt. Stattdessen werden alle Elemente sortiert und dann neu hinzugefügt.
Benötigte NamespacesSystem
System.Collections.Generic
System.Collections.ObjectModel
System.Linq
/// <summary>
/// Sortiert die Elemente einer <see cref="ObservableCollection{TSource}"/>.
/// </summary>
/// <typeparam name="TSource">Der Typ der Elemente in der Auflistung.</typeparam>
/// <typeparam name="TKey">Der Typ nam dem Sortiert werden soll.</typeparam>
/// <param name="source">Die zu sortierende Auflistung.</param>
/// <param name="keySelector">Eine Funktion die den Schlüssel zum sortieren auswählt.</param>
/// <param name="comparer">Ein <see cref="IComparer{TKey}"/> der eine benutzerdefinierte Sortierung durchführt.<para/>
/// Sollte <c>null</c> übergeben werden, wird der Standartvergleich angewendet.</param>
public static void Sort<TSource, TKey>(this ObservableCollection<TSource> source, Func<TSource, TKey> keySelector, IComparer<TKey> comparer)
{
TSource[] sortedList;//Ein Array, damit die Elemente durch source.Clear nicht gelöscht werden
if (comparer == null)
sortedList = source.OrderBy(keySelector).ToArray();
else
sortedList = source.OrderBy(keySelector, comparer).ToArray();
source.Clear();
foreach (var item in sortedList)
source.Add(item);
}
1 Kommentare zum Snippet