【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}");
			}
		}
	}
相关推荐
Behaviour9 小时前
Unity UI循环列表UIScrollViewContent实现
ui·unity·c#·游戏引擎
雾沉川13 小时前
WinRAR 压缩解压软件 功能介绍、硬件适配、横向对比及安装使用教程
windows·winrar·压缩软件
sukalot15 小时前
windows 驱动实例分析系列: wireguard-nt驱动分析-driver篇(一)
windows·驱动开发
百事牛科技16 小时前
Excel部分单元格禁止修改:锁住该锁的,放开该放的
windows·excel
水饺编程16 小时前
第5章,[Win32 章节] :创建、选择和删除画笔
c语言·c++·windows·visual studio
曹牧18 小时前
C#与Java后台交互
java·windows·microsoft·c#
꯭爿꯭巎꯭18 小时前
视频画质修复软件
windows
凯哥Java19 小时前
ChatGPT Windows 客户端突然打不开?提示找不到 Codex CLI,我这样解决了
windows·chatgpt
_ZHOURUI_H_19 小时前
Unity EasyECS:并不是所有字段都适合 SoA,Unity 项目中应该怎样拆数据
游戏·unity·性能优化·架构·游戏引擎
TO_ZRG21 小时前
Unity 编辑器之 SettingsProvider、Hierarchy、Project、SearchField
java·unity·编辑器