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

1、ObservableList 基础 List 类型测试

cs 复制代码
    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 过滤

cs 复制代码
    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(排序和反转)

cs 复制代码
    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(数据事件订阅)

cs 复制代码
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}");
			}
		}
	}
相关推荐
cpsvps_net5 小时前
美国服务器环境下Windows容器工作负载智能弹性伸缩
windows
甄超锋6 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
NRatel6 小时前
亚马逊S3的使用简记(游戏资源发布更新)
游戏·unity·amazon s3
cpsvps8 小时前
美国服务器环境下Windows容器工作负载基于指标的自动扩缩
windows
网硕互联的小客服11 小时前
Apache 如何支持SHTML(SSI)的配置方法
运维·服务器·网络·windows·php
etcix11 小时前
implement copy file content to clipboard on Windows
windows·stm32·单片机
许泽宇的技术分享12 小时前
Windows MCP.Net:基于.NET的Windows桌面自动化MCP服务器深度解析
windows·自动化·.net
SmalBox12 小时前
【渲染流水线】[几何阶段]-[屏幕映射]以UnityURP为例
unity·渲染
非凡ghost13 小时前
AMS PhotoMaster:全方位提升你的照片编辑体验
windows·学习·信息可视化·软件需求
mortimer14 小时前
一次与“顽固”外部程序的艰难交锋:subprocess 调用exe踩坑实录
windows·python·ai编程