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
Freigeben: 2025-01-20 07:01:09
Original
392 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren
<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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage