Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как инвервертировать ObservableCollection ? 
:(
    Опции темы
Stas123
Дата 7.7.2011, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.11.2009

Репутация: нет
Всего: нет



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

Как это лучше и оперативнеее сделать?
PM MAIL   Вверх
YurIOs
Дата 7.7.2011, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 28.6.2011
Где: Ukraine

Репутация: нет
Всего: 1



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


Код

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

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


Это сообщение отредактировал(а) YurIOs - 7.7.2011, 18:33
PM ICQ   Вверх
Stas123
  Дата 8.7.2011, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.11.2009

Репутация: нет
Всего: нет



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

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

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

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

Это сообщение отредактировал(а) Stas123 - 8.7.2011, 11:43
PM MAIL   Вверх
YurIOs
Дата 8.7.2011, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 28.6.2011
Где: Ukraine

Репутация: нет
Всего: 1



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:11
PM ICQ   Вверх
YurIOs
Дата 8.7.2011, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 28.6.2011
Где: Ukraine

Репутация: нет
Всего: 1



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

Это сообщение отредактировал(а) YurIOs - 8.7.2011, 18:34
PM ICQ   Вверх
Stas123
Дата 11.7.2011, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.11.2009

Репутация: нет
Всего: нет



Цитата(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. мне вообще не нужны старые значения.

PM MAIL   Вверх
DenWPF
Дата 14.7.2011, 02:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



Может быть сразу вставлять элементы в начало с помощью INsert(0, item)
PM MAIL   Вверх
-Mikle-
Дата 14.7.2011, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 4
Всего: 59



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


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
Stas123
Дата 14.7.2011, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.11.2009

Репутация: нет
Всего: нет



Всем спасибо с этим вопросом разобрался.
PM MAIL   Вверх
DenWPF
Дата 14.7.2011, 12:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



Так нажми сверху справа топика, что проблема решена.
PM MAIL   Вверх
Stas123
Дата 14.7.2011, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.11.2009

Репутация: нет
Всего: нет



не могу, почему-то когда нажимаю "пометить как решенный" появляется окошечко "Загрузка. Пожалуйста, подождите" и все.
PM MAIL   Вверх
Буратиныч
Дата 4.2.2013, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



А как вставить элемент в коллекцию с заменой, без сдвига, как в Insert?

Это сообщение отредактировал(а) Буратиныч - 4.2.2013, 18:49
PM MAIL   Вверх
dzaraev
Дата 5.2.2013, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 12.1.2013

Репутация: 1
Всего: 1



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

collection[someIndex] = newItem;
--------------------
Если вопрос решён - помечайте тему.  
PM MAIL   Вверх
Буратиныч
Дата 7.2.2013, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



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

collection[someIndex] = newItem;

Т.е. как в массиве? Как всё просто оказывается  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0995 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.