ObservableCollection <> 대 목록 <>


78

List<>각각에 중첩 된 엔티티가 많이 있습니다.

예를 들어, 내가 가진 BaseEntity이있는 List<ColumnEntity>. ColumnEntity클래스 List<Info>등이 있습니다.

WPF UI 로 작업하고 있으며 모든 .NET Framework 목록의 모든 변경 사항을 추적해야합니다 BaseEntity. new ObservableCollection필요한 목록을 기반으로 인스턴스화 하고에 바인딩하여 구현됩니다 ObservableCollection.

이 모든 중첩 Lists을 변경하는 장단점은 무엇입니까 ObservableCollections? 따라서 BaseEntity각 목록 BaseEntity을 수정 된 경계에 다시 할당하지 않고도 모든 변경 사항을 추적 할 수 있습니다 ObservableCollection.

에 특정한 방법 List이 사용되지 않는다고 가정합니다 .

답변:


89

흥미로운 질문은 목록과 ObservableCollection구현 모두 IList<T>거기에 큰 차이가 없다는 것을 고려할 때 WPF가 바인딩 할 수있는 인터페이스 ObservableCollection도 구현 INotifyCollectionChanged합니다.

주요 차이점 중 하나 ObservableCollectionAddRange방법 이 없다는 것 입니다.

또한 내가 ObservableCollection구속력이 없을 것이라는 것을 알고있는 장소에는 사용 하지 않을 것입니다. 이러한 이유로 디자인을 검토하고 우려되는 레이어를 분리하는 데 올바른 접근 방식을 취하고 있는지 확인하는 것이 중요합니다.

Collection<T>와 사이의 차이점에 관해서 List<T>는 여기에서 일반 목록 대 컬렉션을 볼 수 있습니다.


2
링크를 수정하고 변경이 승인되었습니다.
Joe

36

이것이 의미하는 바에 따라 다릅니다.

모든 BaseEntity 목록의 모든 변경 사항을 추적해야합니다.

이미 목록에있는 개체의 변경 사항을 추적하는 것으로 충분합니까? 아니면 개체가 목록에서 제거 / 추가 / 변경되는시기를 알아야합니까?

목록에 전체 수명 동안 동일한 항목이 포함되지만 해당 목록 내의 개별 개체가 변경되는 경우 개체 만 변경 알림 (일반적으로를 통해 INotifyPropertyChanged)을 발생시키는 List<T>것으로 충분 하며 충분합니다. 그러나 목록에 수시로 다른 개체가 포함되거나 순서가 변경되는 경우 ObservableCollection<T>.

따라서 차이점이 흥미로울 수 있지만 (이전 포스터에서 이미이를 다루었 음) 일반적으로 필요 ObservableCollection<T>하거나 필요 하지 않은 선택의 여지 가 많지 않습니다.


3
멋지게 생각했습니다. +1
Subby dec

12

List는 인덱스로 액세스 할 수있는 강력한 형식의 개체 목록을 나타냅니다. 목록을 검색, 정렬 및 조작하는 방법을 제공합니다. List 클래스는 ArrayList 클래스에 해당하는 일반적인 클래스입니다. 필요에 따라 크기가 동적으로 증가하는 배열을 사용하여 IList 제네릭 인터페이스를 구현합니다.

ObservableCollection은 "INotifyCollectionChanged"인터페이스를 사용하여 항목이 추가, 제거되거나 전체 컬렉션이 새로 고쳐질 때 알림을 제공하는 일반적인 동적 데이터 컬렉션입니다.

이 링크에서 자세히 알아보십시오. http://www.codeproject.com/Articles/42536/List-vs-ObservableCollection-vs-INotifyPropertyCha


10

한 가지 더 중요한 차이점은 ObservableCollection이 생성 된 스레드에서만 액세스 할 수 있으며, 여기서 목록은 모든 스레드에서 액세스 할 수 있다는 것입니다.


1
올바르지 않은. 모든 스레드에서 둘 다 액세스 할 수 있습니다. 그러나 ObservableCollection이 ItemsControl에 바인딩 될 때 그래픽이 아닌 스레드에서 변경이 트리거되면 그래픽이 아닌 스레드에서 그래픽 개체를 수정합니다. 그리고이 금지되어 있습니다 -> 예외
엠마뉴엘 두린

6

매우 미미한 성능 오버 헤드 외에는 문제가 없습니다.

내부 목록을 직접 수정하는 경우 변경 사항에 대한 알림이 표시되지 않습니다. 또한 ObservableCollection에 포함 된 개체가 수정되면 알림을받지 않습니다. 요소가 추가, 교체, 제거 또는 이동 된 경우에만 알림이 발생합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.