Закажите ObservableCollection <T> без создания нового
У меня есть следующий код для переопределения коллекции ObservableCollection<T>
:
list = new ObservableCollection<SomeType>( list.OrderBy( c=>c.Ordinal ) );
Этот код работает, но мне не нравится тот факт, что задействовано "новое". Есть ли способ изменить внутренний порядок элементов коллекции ObservableCollection<T>
без создания нового?
Спасибо,
Ответы
Ответ 1
Учитывая, что OrderBy
также новости массива соответствуют размеру вашей коллекции и нескольким другим объектам, у вас есть два варианта:
- Откажитесь от LINQ OrderBy и напишите свой собственный вид, который выполняет сортировку на месте над вашим ObservableCollection с помощью метода Move.
- Подождите, пока текущая реализация станет проблематичной, тогда примените 1.
Не волнуйся, новые вещи не так страшны. Linq делает это все время. Если это не узкое место, все хорошо. Если нет убедительных доказательств того, что сортировка на месте действительно ускорит показ, то здесь нет проблем.
Ответ 2
Внедрите свой собственный метод расширения сортировки для коллекции 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);
}
}
}
Следующий ответ вдохновлен г-ном Жайдером на этот question
Ответ 3
Насколько я могу судить, ObservableCollection имеет метод перемещения элементов внутри коллекции. Вы должны получить компаратор для вашего T-типа, а затем использовать некоторый алгоритм сортировки
Ответ 4
Мой ответ вдохновлен 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);
}
}
}
}
Использование
_someObservableCollection.Sort(x => x.Number, false); // Where number is an simple property (non-onject)