Skip to content

节点类型

Apq.ChangeBubbling 提供多种节点类型,用于构建树形数据结构。

基础节点

BubblingNodeBase

所有节点的抽象基类,提供:

  • 节点名称 (NodeName)
  • 父子关系管理
  • 事件冒泡机制
csharp
public abstract class BubblingNodeBase : IChangeNode
{
    public string NodeName { get; }
    public IChangeNode? Parent { get; }
    public IReadOnlyList<IChangeNode> Children { get; }
}

集合节点

ListBubblingNode<T>

列表节点,用于管理有序集合:

csharp
var users = new ListBubblingNode<User>("Users");

// 添加元素
users.Add(new User { Name = "Alice" });
users.Insert(0, new User { Name = "Bob" });

// 移除元素
users.RemoveAt(0);
users.Remove(user);

// 访问元素
var count = users.Count;
var items = users.Items;

DictionaryBubblingNode<TKey, TValue>

字典节点,用于管理键值对集合:

csharp
var settings = new DictionaryBubblingNode<string, object>("Settings");

// 添加/更新
settings.Put("Theme", "Dark");
settings.Put("FontSize", 14);

// 获取
if (settings.TryGet("Theme", out var theme))
{
    Console.WriteLine($"Theme: {theme}");
}

// 移除
settings.Remove("Theme");

并发节点

ConcurrentBagBubblingNode<T>

线程安全的列表节点:

csharp
var logs = new ConcurrentBagBubblingNode<LogEntry>("Logs");

// 多线程安全操作
Parallel.For(0, 100, i =>
{
    logs.Add(new LogEntry { Message = $"Log {i}" });
});

ConcurrentDictionaryBubblingNode<TKey, TValue>

线程安全的字典节点:

csharp
var cache = new ConcurrentDictionaryBubblingNode<string, object>("Cache");

// 多线程安全操作
Parallel.For(0, 100, i =>
{
    cache.Put($"Key{i}", $"Value{i}");
});

节点树构建

csharp
// 创建根节点
var root = new ListBubblingNode<object>("Root");

// 创建子节点
var users = new ListBubblingNode<User>("Users");
var settings = new DictionaryBubblingNode<string, object>("Settings");

// 附加子节点
root.AttachChild(users);
root.AttachChild(settings);

// 订阅根节点,接收所有子节点的变更
root.NodeChanged += (sender, change) =>
{
    Console.WriteLine($"[{change.Kind}] {change.NodeName}.{change.PropertyName}");
};

静默操作

使用 PopulateSilently 方法批量填充数据而不触发事件:

csharp
var users = new ListBubblingNode<User>("Users");

// 静默填充,不触发事件
users.PopulateSilently(new[]
{
    new User { Name = "Alice" },
    new User { Name = "Bob" },
    new User { Name = "Charlie" }
});

基于 MIT 许可发布