Heim >Backend-Entwicklung >C++ >Wie kann ich in C# effizient Elementbereiche zu einer ObservableCollection hinzufügen und daraus entfernen?

Wie kann ich in C# effizient Elementbereiche zu einer ObservableCollection hinzufügen und daraus entfernen?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-20 07:01:09340Durchsuche

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

ObservableCollection und Batch-Änderung

In C# bietet die Klasse ObservableCollection<T> eine Möglichkeit, Änderungen an Sammlungselementen zu verfolgen und Beobachter über auftretende Änderungen zu benachrichtigen. Diese Klasse unterstützt jedoch nicht die Methode AddRange.

Um dieses Problem zu lösen, können Sie Ihre eigene ObservableRangeCollection-Klasse implementieren, die das gleichzeitige Hinzufügen mehrerer Elemente unterstützt. Hier ist die aktualisierte und optimierte Version in 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>

Mit dieser Implementierung können Sie in einem Vorgang mehrere Elemente zu einer Sammlung hinzufügen oder entfernen und Beobachter werden über OnCollectionChangedEreignisse über die Änderungen benachrichtigt.

Umgang mit Sammlungsänderungen

Wenn Sie Sammlungsänderungen verarbeiten möchten, bevor sie auftreten (z. B. einen Bestätigungsdialog anzeigen), können Sie die INotifyCollectionChangingSchnittstelle implementieren:

<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>

Auf diese Weise können Sie das CollectionChanging-Ereignis verarbeiten, um den Sammlungsänderungsvorgang abzubrechen oder zu ändern.

Das obige ist der detaillierte Inhalt vonWie kann ich in C# effizient Elementbereiche zu einer ObservableCollection hinzufügen und daraus entfernen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn