Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > как инвервертировать ObservableCollection ?


Автор: Stas123 7.7.2011, 17:58
как инвервертировать ObservableCollection ? 
у меня в ObservableCollection  время от времени стираются все старые данные и записываются новые.
После этого я их вывожу на экран.
Хотелось бы выводить их в обратном прорядке.
Т.е. сейчас отображается так
1
3
15
А надо так
15
3
1

Как это лучше и оперативнеее сделать?

Автор: YurIOs 7.7.2011, 18:28
Многие перечислимые типы которые встроенные в .Net Framework  реализуют интерфейс  Collection<T>, который в свою очередь предоставляет метод  Collection<T>.Reverse<T>() -этот метод возвращает ссылку на IEnumerable<T> - список элементов в обратном порядке.


Код

ObservableCollection<T> sourceCollection = new ObservableCollection<T>();

IEnumerable<T> reversedCollection = sourceCollection.Reverse<T>();

Автор: Stas123 8.7.2011, 11:24
YurIOs, спасибо, а как преобразовать IEnumerable<T> в  ObservableCollection<T> ?
Приведение типов не помогло.

Просто, если сделать так в конструкторе
Код

this.Sourse= new ObservableCollection<People>();
            Sourse.CollectionChanged += delegate {
                this.RevSourse = new ObservableCollection<People>(Quotes.Reverse<People>());
            };

то не обновляется перевернутая коллекция.

Автор: YurIOs 8.7.2011, 18:08
Stas123, вам нужно одновременно держать в памяти как исходную коллекцию так и инвертированную, или же инвертирована коллекция используется только во время "вывода на экран" элементов коллекции?

Пока вы ответите на мой вопрос, я опишу иной метод решения вашей проблемы:

Вы, наверное, добавляете новые элементы в ObservableCollection с помощью метода ObservableCollection<T>.Add(T item) - этот метод добавляет элементы в конец списка.
Если изначально добавлять все новые элементы пользуясь методом  ObservableCollection<T>.Insert(int index, T item) - то этот метод добавляет новые элементы в позицию index списка, а остальные элементы с индексом большим за index перемещаются в конец списка. Таким образом в вашем приложении более новые елементы будут в начале списка, а более устарелые в конце. Для этого нужно новые элементы добавлять в коллекцию с помощью строчки кода:
Код

this.Sourse.Insert(0, anyPeople);


А устаревшие элементы всегда будут в конце списка.

Автор: YurIOs 8.7.2011, 18:31
Следует указать что как и первый предложенный мной метод, так и второй, выполняются за время пропорциональное количеству элементов в коллекции, что накладно при большом количестве элементов.
Stas123, 1) почему вы выбрали именно ObservableCollection а не какую-то другую коллекцию?  2) Вам важен вопрос обработки событий  вставки и изменения свойств элементов? 

Автор: Stas123 11.7.2011, 10:02
Цитата(YurIOs @  8.7.2011,  18:08 Найти цитируемый пост)
Stas123, вам нужно одновременно держать в памяти как исходную коллекцию так и инвертированную, или же инвертирована коллекция используется только во время "вывода на экран" элементов коллекции


инвертирована коллекция используется только во время "вывода на экран"


Цитата(YurIOs @  8.7.2011,  18:31 Найти цитируемый пост)
Stas123, 1) почему вы выбрали именно ObservableCollection а не какую-то другую коллекцию? 

потому что 
Цитата(YurIOs @  8.7.2011,  18:31 Найти цитируемый пост)
2) Вам важен вопрос обработки событий  вставки и изменения свойств элементов? 

.

Примерно раз в 0,5 секунд исходная коллекция одновляется полностью. я её вывожу на экран 
Код

<GridViewColumn Width="70" Header="Возраст" DisplayMemberBinding="{Binding Path=Age}" />

я не силен в WPF, но думаю, что DisplayMemberBinding узнает , что коллекция изменилась и выводит её на экран.

По поводу применения Insert. мне вообще не нужны старые значения.

Автор: DenWPF 14.7.2011, 02:11
Может быть сразу вставлять элементы в начало с помощью INsert(0, item)

Автор: -Mikle- 14.7.2011, 09:20
Если речь о WPF, то используй CollectionView с сортировкой между твоей коллекцией и отображением. Объявить его можешь в XAML.

Автор: Stas123 14.7.2011, 10:09
Всем спасибо с этим вопросом разобрался.

Автор: DenWPF 14.7.2011, 12:59
Так нажми сверху справа топика, что проблема решена.

Автор: Stas123 14.7.2011, 13:18
не могу, почему-то когда нажимаю "пометить как решенный" появляется окошечко "Загрузка. Пожалуйста, подождите" и все.

Автор: Буратиныч 4.2.2013, 18:48
А как вставить элемент в коллекцию с заменой, без сдвига, как в Insert?

Автор: dzaraev 5.2.2013, 17:07
Цитата(Буратиныч @  4.2.2013,  18:48 Найти цитируемый пост)
А как вставить элемент в коллекцию с заменой, без сдвига, как в Insert?

http://stackoverflow.com/questions/6873533/observable-collection-replace-item

Автор: Буратиныч 7.2.2013, 16:44
Цитата(dzaraev @ 5.2.2013,  17:07)
Цитата(Буратиныч @  4.2.2013,  18:48 Найти цитируемый пост)
А как вставить элемент в коллекцию с заменой, без сдвига, как в Insert?

http://stackoverflow.com/questions/6873533/observable-collection-replace-item

Т.е. как в массиве? Как всё просто оказывается  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)