C#中的 ObservableCollection 、ObservableRangeCollection

ObservableCollectionObservableRangeCollection 都是用于在 C# 中实现数据绑定的集合类,它们在功能上有一定的差异。

1. 所属命名空间与依赖

ObservableCollection<T>:它是 .NET 框架自带的类,位于 System.Collections.ObjectModel 命名空间下,不需要额外的依赖。

ObservableRangeCollection<T>:它并非 .NET 框架的原生类,通常来自第三方库(如 MvvmCross 或 ReactiveUI 等),使用时需要引入相应的库。

2. 数据变更通知机制

ObservableCollection<T>:当集合中的单个元素发生添加、移除或替换操作时,它会触发 CollectionChanged 事件,通知绑定的 UI 进行更新。
不过,当对集合进行批量操作(例如一次性添加或移除多个元素)时,它会针对每一个操作单独触发 CollectionChanged 事件,这在处理大量数据时可能会导致性能问题。



ObservableRangeCollection<T>:除了支持单个元素操作的 CollectionChanged 事件通知外,它还专门针对批量操作进行了优化。
当进行批量添加、移除或替换操作时,它只会触发一次 CollectionChanged 事件,从而显著提高性能。

3. 功能特性

ObservableCollection<T>:提供了基本的集合操作方法,如 Add、Remove、Insert 等,但没有专门针对批量操作的方法。
ObservableRangeCollection<T>:除了具备 ObservableCollection<T> 的基本功能外,还提供了一些额外的批量操作方法,例如 AddRange、RemoveRange、ReplaceRange 等,方便开发者进行批量数据处理。

示例代码:

使用 ObservableCollection 进行批量添加

using System;
using System.Collections.ObjectModel;

class Program
{
    static void Main()
    {
        var collection = new ObservableCollection<int>();
        collection.CollectionChanged += (sender, e) =>
        {
            Console.WriteLine($"Collection changed: Action = {e.Action}, NewItems = {e.NewItems?.Count}, OldItems = {e.OldItems?.Count}");
        };

        for (int i = 0; i < 10; i++)
        {
            collection.Add(i);//每次调用 Add 方法时,都会触发 CollectionChanged 事件
        }
    }
}

使用 ObservableRangeCollection 进行批量添加(假设使用 MvvmCross 库)

using System;
using MvvmCross.ViewModels;

class Program
{
    static void Main()
    {
        var collection = new ObservableRangeCollection<int>();
        collection.CollectionChanged += (sender, e) =>
        {
            Console.WriteLine($"Collection changed: Action = {e.Action}, NewItems = {e.NewItems?.Count}, OldItems = {e.OldItems?.Count}");
        };

        var itemsToAdd = new int[10];
        for (int i = 0; i < 10; i++)
        {
            itemsToAdd[i] = i;
        }

        collection.AddRange(itemsToAdd);//调用 AddRange 方法时,只会触发一次 CollectionChanged 事件
    }
}

使用场景

如果数据操作以单个元素为主:当应用程序主要进行单个元素的添加、移除或替换操作,且数据量较小,那么使用 ObservableCollection 就足够了,因为它是 .NET 框架自带的,无需额外引入依赖。

如果需要频繁进行批量操作:当需要一次性添加、移除或替换大量元素时,为了避免性能问题,建议使用 ObservableRangeCollection。它的批量操作方法和优化的事件通知机制可以显著提高性能。

posted @ 2025-04-13 08:30  青云Zeo  阅读(337)  评论(0)    收藏  举报