que c#

c# - que - Solicite una ObservableCollection<T> sin crear una nueva



observablecollection methods (4)

Implemente su método de extensión de orden personalizado para la colección Observable

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

La respuesta anterior está inspirada en la respuesta del Sr. Jaider a esta question

Esta pregunta ya tiene una respuesta aquí:

Tengo el siguiente código para reordenar una colección ObservableCollection<T> :

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

Este código funciona, pero no me gusta el hecho de que "nuevo" esté involucrado. ¿Hay alguna manera de cambiar el orden interno de los elementos de una colección ObservableCollection<T> sin crear una nueva?

Gracias,


Mi respuesta está inspirada en bkk.

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

Uso

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


Por lo que puedo decir, ObservableCollection tiene un método para mover elementos dentro de la colección. Debería obtener un comparador para su tipo T, y luego usar algún algoritmo de clasificación


Teniendo en cuenta que OrderBy también OrderBy una matriz para que coincida con el tamaño de su colección y varios otros objetos, tiene dos opciones:

  1. Renuncie a LINQ OrderBy y escriba su propia ordenación que realice una clasificación in situ sobre su ObservableCollection utilizando el método Move.
  2. Espere hasta que la implementación actual se vuelva problemática y luego aplique 1.

No te preocupes, renovar cosas no es tan terrible. Linq lo hace todo el tiempo. A menos que sea un cuello de botella, todo es bueno. A menos que haya evidencia convincente de que la clasificación en el lugar realmente acelerará el espectáculo, entonces no hay problema aquí.