当前位置: 首页 > news >正文

【Unity】R3 CSharp 响应式编程 - 使用篇(集合)(三)

1、ObservableList 基础 List 类型测试

    using System;using System.Collections.Specialized;using ObservableCollections;using UnityEngine;namespace Aladdin.Standard.Observable.Collections.List{public class ObservableListTest : MonoBehaviour{protected readonly ObservableList<int> observableList = new ObservableList<int>();public void Start(){ISynchronizedView<int, string> observableListSynchronizedView = this.observableList.CreateView((value) => $"这是测试数据: {value}");observableListSynchronizedView.ViewChanged += this.ObservableListSynchronizedViewViewChanged;this.observableList.Add(1);this.observableList.Add(2);this.observableList.Add(3);this.observableList.AddRange(new[] { 4, 5, 6 });this.observableList[4] = 8;this.observableList.RemoveAt(0);this.observableList.Move(2, 0);foreach (int value in this.observableList){Debug.LogError($"{value}");}foreach (string value in observableListSynchronizedView){Debug.LogError($"{value}");}this.observableList.Sort();this.observableList.Reverse();this.observableList.Clear();observableListSynchronizedView.Dispose();}internal void ObservableListSynchronizedViewViewChanged(in SynchronizedViewChangedEventArgs<int, string> eventArgs){switch (eventArgs.Action){case NotifyCollectionChangedAction.Add:Debug.LogError($"添加数据:{eventArgs.NewItem.View}");break;case NotifyCollectionChangedAction.Move:Debug.LogError($"移动数据:{eventArgs.NewItem.View}");break;case NotifyCollectionChangedAction.Remove:Debug.LogError($"删除数据:{eventArgs.OldItem.View}");break;case NotifyCollectionChangedAction.Replace:Debug.LogError($"替换数据:{eventArgs.NewItem.View} {eventArgs.OldItem.View}");break;case NotifyCollectionChangedAction.Reset:Debug.LogError($"重置数据:{eventArgs.SortOperation.IsSort} {eventArgs.SortOperation.IsClear} {eventArgs.SortOperation.IsReverse}");break;default:throw new ArgumentOutOfRangeException();}}}}

2、List ObservableCollections Filter 过滤

    using ObservableCollections;using UnityEngine;namespace Aladdin.Standard.Observable.Collections.List{public class ObservableListFilter : MonoBehaviour{protected readonly ObservableList<int> observableList = new ObservableList<int>();public void Start(){this.observableList.Add(1);this.observableList.Add(20);this.observableList.AddRange(new[] { 30, 31, 32 });foreach (int value in this.observableList){Debug.LogError($"未过滤:{value}");}ISynchronizedView<int, string> observableListSynchronizedView = this.observableList.CreateView((value) => $"过滤: {value}");Debug.LogError($"数据长度:{observableListSynchronizedView.Count} ========================");observableListSynchronizedView.AttachFilter(value => value % 2 == 0);foreach (string value in observableListSynchronizedView){Debug.LogError($"{value}");}Debug.LogError($"数据长度:{observableListSynchronizedView.Count} ========================");observableListSynchronizedView.AttachFilter(x => x % 2 == 1);foreach (string value in observableListSynchronizedView){Debug.LogError($"{value}");}Debug.LogError($"数据长度:{observableListSynchronizedView.Count} ========================");observableListSynchronizedView.Dispose();}}}

3、List ObservableCollections Sort And Reverse(排序和反转)

    using System.Collections.Generic;using ObservableCollections;using UnityEngine;namespace Aladdin.Standard.Observable.Collections.List{public class ObservableListSortAndReverse : MonoBehaviour{protected readonly ObservableList<int> observableList = new ObservableList<int>();public void Start(){this.observableList.AddRange(new[] { 1, 301, 20, 50001, 4000 });foreach (int value in this.observableList){Debug.LogError($"正常数据:{value}");}ISynchronizedView<int, string> observableListSynchronizedView = this.observableList.CreateView((value) => $"数据: {value}");Debug.LogError($"数据长度:{observableListSynchronizedView.Count} ========================");observableListSynchronizedView.AttachFilter(value => value % 2 == 0);foreach (string value in observableListSynchronizedView){Debug.LogError($"{value}");}Debug.LogError($"======================== 数据正常过滤 ========================");this.observableList.Reverse();foreach (string value in observableListSynchronizedView){Debug.LogError($"{value}");}Debug.LogError($"======================== 数据反转数据长度 ========================");observableListSynchronizedView.ResetFilter();foreach (string value in observableListSynchronizedView){Debug.LogError($"{value}");}Debug.LogError($"======================== 取消数据过滤:{observableListSynchronizedView.Count} ========================");this.observableList.Sort();foreach (string value in observableListSynchronizedView){Debug.LogError($"{value}");}Debug.LogError($"======================== 数据排序 Sort ========================");this.observableList.Sort(new DescendantComparer());foreach (string value in observableListSynchronizedView){Debug.LogError($"{value}");}Debug.LogError($"======================== 数据排序 自定义 ========================");observableListSynchronizedView.Dispose();}struct DescendantComparer : IComparer<int>{public int Compare(int x, int y){return y.CompareTo(x);}}}}

4、List ObservableCollections Subscribe(数据事件订阅)

using System.Collections.Generic;using ObservableCollections;using R3;using UnityEngine;namespace Aladdin.Standard.Observable.Collections.List{/// <summary> 这里主要是测试集合添加数据移除数据的回调测试, Package: ObservableCollections.R3 </summary>public class ObservableListSubscribe : MonoBehaviour{protected readonly ObservableList<int> observableList = new ObservableList<int>();public void Start(){this.observableList.ObserveAdd().Subscribe(this.ObservableListAdd);this.observableList.ObserveChanged().Subscribe(this.ObservableListChanged);this.observableList.ObserveRemove().Subscribe(this.ObservableListRemove);this.observableList.ObserveReplace().Subscribe(this.ObservableListReplace);this.observableList.ObserveMove().Subscribe(this.ObservableListMove);this.observableList.ObserveReset().Subscribe(this.ObservableListReset);this.observableList.ObserveClear().Subscribe(this.ObservableListClear);this.observableList.ObserveReverse().Subscribe(this.ObservableListReverse);this.observableList.ObserveSort().Subscribe(this.ObservableListSort);this.observableList.ObserveCountChanged().Subscribe(this.ObservableListCountChanged);this.observableList.Add(1);this.observableList.Add(20);this.observableList.AddRange(new[] { 30, 31, 32 });this.observableList[1] = 60;this.observableList.Move(1, 0);this.observableList.RemoveAt(0);this.observableList.Move(1, 0);this.observableList.Sort();this.observableList.Sort(new DescendantComparer());foreach (int value in this.observableList){Debug.LogError($"{value}");}}struct DescendantComparer : IComparer<int>{public int Compare(int x, int y){return y.CompareTo(x);}}internal void ObservableListCountChanged(int count){Debug.Log($"数据长度变动:{count}");}internal void ObservableListSort((int Index, int Count, IComparer<int> Comparer) sortTuple){Debug.Log($"数据排序:{sortTuple.Index} {sortTuple.Count} {sortTuple.Comparer}");}internal void ObservableListReverse((int Index, int Count) reverseTuple){Debug.Log($"数据反转:{reverseTuple.Index} {reverseTuple.Count}");}internal void ObservableListClear(Unit unit){Debug.Log($"数据清理:{unit}");}internal void ObservableListReset(CollectionResetEvent<int> collectionEvent){Debug.Log($"数据重置:{collectionEvent.Index} isClear={collectionEvent.IsClear} isReverse={collectionEvent.IsReverse} isSort={collectionEvent.IsSort}");}internal void ObservableListMove(CollectionMoveEvent<int> collectionEvent){Debug.Log($"数据移动:ni={collectionEvent.NewIndex} oi={collectionEvent.OldIndex} v={collectionEvent.Value}");}internal void ObservableListChanged(CollectionChangedEvent<int> changedEvent){Debug.Log($"数据变动:o={changedEvent.OldItem} n={changedEvent.NewItem}");}internal void ObservableListReplace(CollectionReplaceEvent<int> replaceEvent){Debug.Log($"数据替换:o={replaceEvent.OldValue} n={replaceEvent.NewValue}");}internal void ObservableListRemove(CollectionRemoveEvent<int> removeEvent){Debug.Log($"删除数据:o={removeEvent.Value}");}internal void ObservableListAdd(CollectionAddEvent<int> addEvent){Debug.Log($"添加数据:{addEvent}");}}}

相关文章:

  • 星闪开发之Server-Client 指令交互控制OLED灯案例
  • 【后端】RPC
  • React---扩展补充
  • (四)docker命令
  • Fullstack 面试复习笔记:项目梳理总结
  • Oracle OCP与MySQL OCP认证如何选?
  • APx500录制波形
  • QGIS新手教程3:QGIS矢量图层导入与导出+Shape Tools插件绘图
  • 找到每一个单词+模拟的思路和算法
  • Unity与Excel表格交互热更方案
  • linux操作系统---网络协议
  • 配置GDAL使用工具
  • 什么是梯度磁场
  • Mysql中explain分析sql查询含义
  • Rocket客户端消息确认机制
  • Python IP可达性检测脚本解析
  • innovus: ecoAddRepeater改变hier层级解决办法
  • TinaCloud:为 TinaCMS 打造的专业云服务平台
  • 2025年6月4日第一轮
  • layer norm和 rms norm 对比
  • 标准件做网站推广效果怎么样/为什么sem的工资都不高
  • 旅游网站建设目标/app拉新推广项目
  • 合肥建设工程竣工结算备案网站/免费加精准客源
  • 做设计找图片的网站/网站新站整站排名
  • 上海第五届世界进口博览会/seo关键词推广
  • 大良网站建设公司/专业拓客公司联系方式