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# Komplett

Sie kennen sich in objektorientierter Programmierung aus. Sie schreiben C++ oder Java? Und nun stehen Sie vor der Aufgabe, in C# Anwendungen zu erstellen. Das C# Komplett-Seminar verschafft Ihnen umfassende Programmierkenntnisse in dieser Sprache. Nach der Schulung entwickeln Sie selbständig Anwendungen mit C#. Sie kennen die Datentypen und Klassenbibliotheken der objektorientierten Programmiersprache C#. Der Komplettkurs setzt bei den Grundlagen von C# ein. Sie arbeiten mit Variablen und konvertieren Typen. Multithreading, Delegates, Generics sind nach dem Seminar für Sie kein Geheimnis mehr.

C# 2017/2015/2013 Aufbau

In dieser Schulung lernen Sie fortgeschrittene Techniken im Bereich .Net C#. Dabei stehen neben den eigentlichen Techniken auch architektonische Aspekte im Mittelpunkt.

/// <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!