> 백엔드 개발 > C++ > C#의 ObservableCollection에서 항목 범위를 효율적으로 추가하고 제거하려면 어떻게 해야 합니까?

C#의 ObservableCollection에서 항목 범위를 효율적으로 추가하고 제거하려면 어떻게 해야 합니까?

Patricia Arquette
풀어 주다: 2025-01-20 07:01:09
원래의
393명이 탐색했습니다.

How Can I Efficiently Add and Remove Ranges of Items from an ObservableCollection in C#?

ObservableCollection 및 일괄 수정

C#에서 ObservableCollection<T> 클래스는 컬렉션 항목의 변경 사항을 추적하고 변경 사항이 발생했음을 관찰자에게 알리는 방법을 제공합니다. 하지만 이 클래스는 AddRange 메서드를 지원하지 않습니다.

이 문제를 해결하려면 한 번에 여러 항목을 추가하는 것을 지원하는 고유한 ObservableRangeCollection 클래스를 구현할 수 있습니다. C# 7의 업데이트되고 최적화된 버전은 다음과 같습니다.

<code class="language-csharp">using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;

public class ObservableRangeCollection<T> : ObservableCollection<T>
{
    public void AddRange(IEnumerable<T> collection)
    {
        if (collection == null) throw new ArgumentNullException(nameof(collection));

        foreach (var item in collection) Items.Add(item);
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    }

    public void RemoveRange(IEnumerable<T> collection)
    {
        if (collection == null) throw new ArgumentNullException(nameof(collection));

        foreach (var item in collection) Items.Remove(item);
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    }

    public void Replace(T item)
    {
        ReplaceRange(new[] { item });
    }

    public void ReplaceRange(IEnumerable<T> collection)
    {
        if (collection == null) throw new ArgumentNullException(nameof(collection));

        Items.Clear();
        foreach (var item in collection) Items.Add(item);
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    }
}</code>
로그인 후 복사

이 구현을 사용하면 한 번의 작업으로 컬렉션에 여러 항목을 추가하거나 제거할 수 있으며 OnCollectionChanged 이벤트를 통해 관찰자에게 변경 사항을 알릴 수 있습니다.

컬렉션 수정 처리

컬렉션 수정이 발생하기 전에 처리하려면(예: 확인 대화 상자 표시) INotifyCollectionChanging인터페이스

를 구현할 수 있습니다.
<code class="language-csharp">public interface INotifyCollectionChanging<T>
{
    event NotifyCollectionChangingEventHandler<T> CollectionChanging;
}</code>
로그인 후 복사
<code class="language-csharp">public class ObservableRangeCollection<T> : ObservableCollection<T>, INotifyCollectionChanging<T>
{
    // ...

    protected override void ClearItems()
    {
        var e = new NotifyCollectionChangingEventArgs<T>(NotifyCollectionChangedAction.Reset, Items);
        OnCollectionChanging(e);
        if (e.Cancel) return;

        base.ClearItems();
    }

    // ...

    public event NotifyCollectionChangingEventHandler<T> CollectionChanging;
    protected virtual void OnCollectionChanging(NotifyCollectionChangingEventArgs<T> e)
    {
        CollectionChanging?.Invoke(this, e);
    }
}</code>
로그인 후 복사

이렇게 하면 CollectionChanging 이벤트를 처리하여 컬렉션 수정 작업을 취소하거나 수정할 수 있습니다.

위 내용은 C#의 ObservableCollection에서 항목 범위를 효율적으로 추가하고 제거하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿