Feedback

C# - ObservableCollection<T> sortieren

Veröffentlicht von am 3/18/2014
(1 Bewertungen)
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 Namespaces
System
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

Martin Dauskardt schrieb am 12/22/2017:
Sehr gut, genau das habe ich gerade gesucht :-)
 

Logge dich ein, um hier zu kommentieren!