Как я могу отсортировать ObservableCollection <T>так, чтобы мой пользовательский интерфейс также видел процесс сортировки? - PullRequest
3 голосов
/ 05 февраля 2011

У меня есть список, чья панель элементов настроена на обертку. Я хочу, чтобы всякий раз, когда новый элемент добавлялся в список, моя коллекция сортировалась, и процесс должен отображаться в пользовательском интерфейсе. Я имею в виду, что пользователь должен видеть этот необычный эффект, чтобы помочь им определить, что элемент сортируется. Я посмотрел несколько постов по stackoverflow, и они предлагают использовать CollectionViewSource. Однако мой источник данных привязан к ObservableCollection во ViewModel.

Сначала я написал этот код. Это работает, однако, поскольку новая коллекция связана, я не вижу такого необычного эффекта, когда элементы в контейнере просто перемещаются в свою новую позицию из исходной позиции: -

 var photoList = PhotosToUpload.ToList<Photo>();
            photoList.Sort(new PhotoSorter());
            PhotosToUpload = new ObservableCollection<Photo>(photoList);

Это мой класс: -

 public class PhotoSorter : IComparer<Photo>
    {

        public int Compare(Photo x, Photo y)
        {
            return x.PhotoByteArr.Length - x.PhotoByteArr.Length;
        }
    }

Тогда я написал простой алгоритм сортировки пузырьков. Это дает желаемый эффект, но я не знаю, почему это занимает слишком много времени. Я знаю, что это самый неэффективный алгоритм, который может придумать кто угодно, но сортировка 10 элементов не должна занимать больше секунды. Здесь это занимает 4-5 секунд.

for (int i = 0; i < PhotosToUpload.Count; i++)
            {
                for (int j = 0; j < PhotosToUpload.Count - 1 - i; j++)
                {
                    if (PhotosToUpload[j].PhotoByteArr.Length > PhotosToUpload[j + 1].PhotoByteArr.Length)
                    {
                        Photo photo = PhotosToUpload[j];
                        PhotosToUpload[j] = PhotosToUpload[j + 1];
                        PhotosToUpload[j + 1] = photo;
                    }
                }
            }

Кто-нибудь может сказать мне, что я могу сделать лучше всего на данный момент? и почему сортировка пузырьков занимает так много времени даже с 10 предметами?

1 Ответ

1 голос
/ 05 февраля 2011

Чтобы проверить изменения, используйте событие CollectionChanged.

В вашем компараторе есть ошибка:

return x.PhotoByteArr.Length - y.PhotoByteArr.Length;

КстатиВаш код выполняется для меня мгновенно ... Может быть, проблема в вашем классе фотографии?Или ваша привязка / события?

Является ли Photo.PhotoByteArr расчетным значением?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...