Feedback

C# - ObservableCollection<T> sortieren

Veröffentlicht von am 18.03.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
GFU-Schulungen  [Anzeige]

C# Aufbaukurs

Sie haben grundlegende .NET- und C#-Kenntnisse und und wollen diese nun erweitern. Der Aufbaukurs C# führt Sie ein die Arbeit mit Interfaces und Delegates, Generics und Parallel Computing.

C# 2017/2015/2013 Grundlagen

Nach Abschluss des Kurses sind Ihnen die Datentypen und Klassenbibliotheken von C# bekannt. Außerdem sind Sie in der Lage, mit Variablen umzugehen und deren Typen zu konvertieren. Sie definieren Namespaces und setzen diese ein, Sie erstellen eigene Klassen  und bauen Trouble Shooting ein.

/// <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 22.12.2017:
Sehr gut, genau das habe ich gerade gesucht :-)
 

Logge dich ein, um hier zu kommentieren!