C#中的 ObservableCollection 、ObservableRangeCollection
ObservableCollection
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
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
如果需要频繁进行批量操作:当需要一次性添加、移除或替换大量元素时,为了避免性能问题,建议使用 ObservableRangeCollection

浙公网安备 33010602011771号