ホームページ > バックエンド開発 > C++ > C# で ObservableCollection に項目範囲を効率的に追加および削除するにはどうすればよいですか?

C# で ObservableCollection に項目範囲を効率的に追加および削除するにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-20 07:01:09
オリジナル
338 人が閲覧しました

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>
ログイン後にコピー

この実装により、1 回の操作で複数の項目をコレクションに追加または削除でき、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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート