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í:
- Ordenar ObservableCollection <string> C # 10 respuestas
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:
- 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.
- 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í.