【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}");
			}
		}
	}
相关推荐
csdn_aspnet26 分钟前
在 Windows 机器上安装和配置 RabbitMQ
windows·rabbitmq
小赖同学啊1 小时前
物联网中的Unity/Unreal引擎集成:数字孪生与可视化控制
物联网·unity·游戏引擎
csdn_aspnet1 小时前
Windows Server 上的 RabbitMQ 安装和配置
windows·rabbitmq
Zlzxzw4 小时前
使用unity创建项目,进行动画制作
unity·游戏引擎
热爱生活的猴子5 小时前
Poetry 在 Linux 和 Windows 系统中的安装步骤
linux·运维·windows
R-sz8 小时前
java流式计算 获取全量树形数据,非懒加载树,递归找儿
java·开发语言·windows
X_StarX9 小时前
【Unity笔记01】基于单例模式的简单UI框架
笔记·ui·unity·单例模式·游戏引擎·游戏开发·大学生
九班长9 小时前
Golang服务端处理Unity 3D游戏地图与碰撞的详细实现
3d·unity·golang
ysn1111112 小时前
NGUI实现反向定位到层级面板结点
unity
柳鲲鹏15 小时前
WINDOWS最快布署WEB服务器:apache2
服务器·前端·windows