2013-05-31 3 views
2

Мне нужно сделать некоторые программы в C# и для выполнения IO между программами, которые я должен использовать, или с использованием свойства INotifyPropertyChange (на List<>) или ObservableCollection<>.Производительность, лучше ли использовать Observable collection или INotifyPropertyChange?

Я хотел бы знать, какой из них лучше выполнять операцию ввода-вывода между программами C#.

Спасибо за чтение

+1

Почему бы не просто написать код, используя тот, который лучше всего подходит для вашего дизайна? Подумав об этом сейчас, вы не концентрируетесь на проблеме. –

+0

Ну, у обоих есть один и тот же дизайн, это список String или oobservable коллекции строки, мой вопрос не о дизайне, но производительность – user2417992

+2

@ user2417992 сделать тест тогда :) –

ответ

7

Основываясь на критериях, которые вы перечисляете в вопросе & комментариев, вам лучше всего наблюдать ObservableCollection.

Интерфейс INotifyPropertyChanged существует, чтобы сказать вам, что это - свойство изменилось. Когда вы говорите о списке, свойства будут такими, как Count и Item []. Это означает, что, фактически, все, что вам на самом деле говорят, это «содержимое списка изменилось», но не какие-либо подробности относительно того, что это было на самом деле. Без какой-либо такой информации весь ваш контроль действительно может полностью перерисоваться на основе текущего состояния коллекции.

С ObservableCollection, однако, вам сообщают, когда элемент добавлен (и что этот элемент был и где он был добавлен) и когда элемент удален (и что этот элемент был и где он был раньше).Это достаточно информации для вашего пользовательского интерфейса, чтобы переделать только , что фактически изменило, что намного эффективнее, чем перерисовать всю вещь. Вот почему ObservableCollection был изобретен - используйте его!

+0

Спасибо за ваш очень четкий ответ =) – user2417992

+1

Когда количество предметов превышает 100 000, характеристики и объем памяти ObservableCollection заставят любой компьютер свернуть. В этом случае перейдите к массиву, который вы воссоздаете при каждом изменении. Не учебник «MVVM», но быстрый (более чем в 30 раз быстрее для конкретных тестов, которые я сделал для своего приложения). – GameAlchemist

1

INotifyPropertyChanged используется для уведомления пользовательского интерфейса, когда значение свойства или ограниченная коллекция изменяется. Принимая во внимание, что ObservableCollection используется для уведомления пользовательского интерфейса, когда связанная коллекция модифицирована (например, добавление или удаление объекта из коллекции). Невозможно уведомить пользовательский интерфейс, если значение свойства в одном из объектов коллекции изменено.

+0

Ну, как я могу использовать notifyPropertychange в списке, на самом деле они делают то же самое – user2417992

+0

Ну, есть другое: если вы используете ObservableCollection, он будет уведомлять пользовательский интерфейс только в случае каких-либо изменений в коллекции (например: Добавление нового объекта или удаление объект) Но он не может уведомить, изменяется ли свойство в одном из объектов в коллекции. – Kurubaran

+0

Еще раз в моем случае это то же самое, я получаю только список строк (иногда объект, содержащий много строк), но как только они находятся в списке, они не могут измениться (но их можно удалить), так что это одно и то же , – user2417992

4

Обратите внимание, что ObservableCollection наследует как INotifyCollectionChanged, так и INotifyPropertyChanged.

[SerializableAttribute] 
public class ObservableCollection<T> : Collection<T>, 
    INotifyCollectionChanged, INotifyPropertyChanged 

См документация из указанных выше ссылки:

Во многих случаях данных, что вы работаете с представляет собой набор объектов. Например, общий сценарий привязки данных заключается в использовании элемента ItemsControl, такого как ListBox, ListView или TreeView, для отображения коллекции записей. Вы можете перечислить любую коллекцию, которая реализует интерфейс IEnumerable. Тем не менее, чтобы настроить динамические привязки, чтобы вставки или удаления в коллекции обновляли пользовательский интерфейс автоматически, коллекция должна реализовать интерфейс INotifyCollectionChanged. Этот интерфейс предоставляет событие CollectionChanged, событие, которое следует поднимать всякий раз, когда меняется базовая коллекция.

WPF предоставляет класс ObservableCollection , который является встроенным в осуществлении сбора данных, который реализует INotifyCollectionChanged интерфейса. Прежде чем внедрять свою собственную коллекцию, рассмотрите возможность использования ObservableCollection или одного из существующих классов коллекции, например List, Collection и BindingList, среди многих других. Если у вас есть расширенный сценарий и вы хотите реализовать свою собственную коллекцию, подумайте об использовании IList, который предоставляет не общий набор объектов, к которым можно получить доступ по индексу. Реализация IList обеспечивает лучшую производительность с помощью механизма привязки данных.

+0

Спасибо =) Я понимаю, что-то сейчас! – user2417992

1

Эти две альтернативы не делают то же самое. Вы выбираете между этими двумя вариантами:

  1. свойство списка реализацией INotifyPropertyChanged, где вы бросаете это событие каждый раз, когда список модифицируется
  2. свойства типа ObservableCollection

С опцией 1, когда вы изменяете список, возникает событие, в котором говорится, что «весь список изменился». Если у вас есть элемент пользовательского интерфейса, связанный с этим списком (скажем, ListBox), элемент всего необходимо будет перерисовать, поскольку он должен предположить, что весь список был изменен (то есть: он больше не может быть тот же список!).

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

Рассмотрите пример, когда вы удаляете элемент из своего списка, а список привязан к элементу управления WPF ListBox. С помощью опции 1 все содержимое списка воссоздается. С помощью опции 2 элемент удаленного элемента удаляется, а остальная часть списка остается нетронутой.

должен быть ясен из этого примера, что ObservableCollection - поскольку он поддерживает событие, которое конкретные к тому, что вы делаете - будет более эффективным во многих случаях. Тем не менее, если у вас нет большого количества данных в коллекции или очень сложного пользовательского интерфейса, прирост производительности будет незначительным. Кроме того, если вы вносите большие изменения в свой список, вы вполне можете обнаружить, что быстрее обновить весь список.

В конечном счете, на вопрос о производительности нельзя точно ответить на StackOverflow без повторения мантры: профиль вашего кода и принять решение на основе результатов.

Смежные вопросы