首頁 >後端開發 >C++ >如何在 C# 中有效地從 ObservableCollection 中新增和刪除項目範圍?

如何在 C# 中有效地從 ObservableCollection 中新增和刪除項目範圍?

Patricia Arquette
Patricia Arquette原創
2025-01-20 07:01:09338瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn