Maison >développement back-end >C++ >Comment puis-je ajouter et supprimer efficacement des plages d'éléments d'une ObservableCollection en C# ?

Comment puis-je ajouter et supprimer efficacement des plages d'éléments d'une ObservableCollection en C# ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-20 07:01:09338parcourir

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

ObservableCollection et modification par lots

En C#, la classe ObservableCollection<T> fournit un moyen de suivre les modifications apportées aux éléments de collection et d'informer les observateurs que des modifications se produisent. Cependant, cette classe ne prend pas en charge la méthode AddRange.

Pour résoudre ce problème, vous pouvez implémenter votre propre ObservableRangeCollection classe, qui prend en charge l'ajout de plusieurs éléments à la fois. Voici la version mise à jour et optimisée en 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>

Cette implémentation vous permet d'ajouter ou de supprimer plusieurs éléments à une collection en une seule opération, et elle informera les observateurs des changements via des OnCollectionChanged événements.

Gestion des modifications de collection

Si vous souhaitez gérer les modifications de la collection avant qu'elles ne se produisent (par exemple, afficher une boîte de dialogue de confirmation), vous pouvez implémenter l'INotifyCollectionChanginginterface :

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

Vous pouvez ainsi gérer l'événement CollectionChanging pour annuler ou modifier l'opération de modification de la collection.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn