Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Menambah dan Mengalih Keluar Julat Item dengan Cekap daripada ObservableCollection dalam C#?

Bagaimanakah Saya Boleh Menambah dan Mengalih Keluar Julat Item dengan Cekap daripada ObservableCollection dalam C#?

Patricia Arquette
Lepaskan: 2025-01-20 07:01:09
asal
337 orang telah melayarinya

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

ObservableCollection dan pengubahsuaian kelompok

Dalam C#, kelas ObservableCollection<T> menyediakan cara untuk menjejaki perubahan pada item koleksi dan memberitahu pemerhati bahawa perubahan berlaku. Walau bagaimanapun, kelas ini tidak menyokong kaedah AddRange.

Untuk menyelesaikan masalah ini, anda boleh melaksanakan kelas ObservableRangeCollection anda sendiri, yang menyokong penambahan berbilang item sekaligus. Berikut ialah versi yang dikemas kini dan dioptimumkan dalam 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>
Salin selepas log masuk

Pelaksanaan ini membolehkan anda menambah atau mengalih keluar berbilang item pada koleksi dalam satu operasi, dan ia akan memberitahu pemerhati tentang perubahan melalui acara OnCollectionChanged.

Mengendalikan pengubahsuaian koleksi

Jika anda ingin mengendalikan pengubahsuaian koleksi sebelum ia berlaku (contohnya, tunjukkan dialog pengesahan), anda boleh melaksanakan INotifyCollectionChangingantara muka:

<code class="language-csharp">public interface INotifyCollectionChanging<T>
{
    event NotifyCollectionChangingEventHandler<T> CollectionChanging;
}</code>
Salin selepas log masuk
<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>
Salin selepas log masuk

Dengan cara ini anda boleh mengendalikan acara CollectionChanging untuk membatalkan atau mengubah suai operasi pengubahsuaian koleksi.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menambah dan Mengalih Keluar Julat Item dengan Cekap daripada ObservableCollection dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan