LuaTable转C#的列表List和字典Dictionary
LuaTable转C#的列表List和字典Dictionaty
- 介绍
- lua中创建表测试
- lua中list表
- 表转成List
- 表转成Dictionary
- 键值对表
- 表转成Dictionary
- 多类型键值对表
- 表转成Dictionary
- 总结
介绍
之前基本都是从C#中的List或者Dictionary转成luaTable,很少会把LuaTable转成C#的List或者Dictionary,前几天正好做需求的时候要将lua里面的数据转成C#中的集合,C#List或者Dictionary转成luaTable的文章之前写过可以直接参考。
lua中创建表测试
lua中list表
注意luatable的数据是从1开始的 不是从0开始,这里默认的Key是1,2,3,4,5,6,7,8,9
--lua中的表this.testList = {1,2,3,4,5,6,7,8,9}--C#中//获取lua表LuaTable table = LuaManager.lua.GetTable("UIMainCityCtrl.testList");//lua表的长度打印Debug.LogError("table.Length = " + table.Length);//转换成数组打印object[] tabArray = table.ToArray();for (int i = 0; i < tabArray.Length; i++){Debug.LogError("tabArray[" + i + "] = " + tabArray[i]);}//使用luaTable直接打印for (int i = 0; i < table.Length; i++){Debug.LogError("table[" + (i + 1).ToString() + "] = " + table[(i + 1)]);}//上面的这两种打印的结果都是一样的。如果使用的是
打印如下所示:

表转成List
这两个方法本质上其实是一样的,LuaArrayTable可以理解成是对object[]的一层封装
方法一
object[] obj = table.ToArray();List<object> arr1 = new List<object>(obj);#region 打印一var iter = arr1.GetEnumerator();while (iter.MoveNext()){Debug.LogError("iter.Current = " + iter.Current);}#endregion#region 打印二arr1.ForEach((item) => {Debug.LogError("item = " + item);});#endregion

方法二
这里只是转换方法稍微变了一下,这里不多解释了,只是封装了一下
//LuaArrayTable luaArray = table.ToArrayTable(); 另一种转换方法LuaArrayTable luaArray = new LuaArrayTable(table);//LuaArrayTable的打印如下var iter = luaArray.GetEnumerator();while (iter.MoveNext()){ Debug.LogError("iter = " + iter.Current);}List<object> arr2 = new List<object>(luaArray);//简化下来可以这样List<object> arr2 = luaArray.ToList();
注意一点LuaArrayTable其实就是对List的一层封装,所以Key只能是Int

表转成Dictionary
//直接转成Object,object类型字典LuaDictTable<object, object> luaArray = table.ToDictTable<object, object>(); //Dictionary<object, object> dic = luaArray.ToDictionary(k => k.Key, v => v.Value);Dictionary<object, object> dic = luaArray.ToDictionary();//转成Int,Object类型的字典LuaDictTable<int, object> luaArray = table.ToDictTable<int, object>();//Dictionary<int, object> dic = luaArray.ToDictionary(k => k.Key, v => v.Value);Dictionary<int, object> dic = luaArray.ToDictionary();//转成int,int类型的字典LuaDictTable<int, int> luaArray = table.ToDictTable<int, int>(); //Dictionary<int, int> dic = luaArray.ToDictionary(k => k.Key, v => v.Value);Dictionary<int, int> dic = luaArray.ToDictionary();//转成int,string类型的字典LuaDictTable<int, string> luaArray = table.ToDictTable<int, string>(); //Dictionary<int, string> dic = luaArray.ToDictionary(k => k.Key, v => v.Value);Dictionary<int, string> dic = luaArray.ToDictionary();//打印代码var itor = dic.GetEnumerator();while (itor.MoveNext()){Debug.LogError("itor.Current.Key = " + itor.Current.Key + " ,itor.Current.Value = " + itor.Current.Value);}itor.Dispose();
打印如下

键值对表
键值对的这种表必然是无法转成list,既然是键值对只能转成字典Dictionary
--lua中--table表现的dictionarythis.testDic = {["1"] = 50,["a"] = 80,["3"] = 120,["b"] = 130}//C#中//获取lua表的另一种获取方法//LuaTable table = LuaManager.lua.GetTable("UIMainCityCtrl.testDic");//lua表的长度打印Debug.LogError("table.Length = " + table.Length);LuaDictTable dic = table.ToDictTable();//同上面的这个转换一样//LuaDictTable<string, object> dic = table.ToDictTable<string,object>();//转成value为int的键值对字典//LuaDictTable<string, int> dic = table.ToDictTable<string, int>();var itor = dic.GetEnumerator();while (itor.MoveNext()){Debug.LogError("itor.Current.Key = " + itor.Current.Key + " ,itor.Current.Value = " + itor.Current.Value);}itor.Dispose();
打印如下所示:
这里有一点是键值对方式的LuaTable是没有长度的,长度为0

表转成Dictionary
转换成字典的方式
//string,object类型字典LuaDictTable dic = table.ToDictTable();Dictionary<string, object> unitydic = dic.ToDictionary(k=>k.Key.ToString(),v => v.Value);//LuaDictTable<string, object> dic = table.ToDictTable<string, object>();//Dictionary<string, object> unitydic = dic.ToDictionary(); //string int类型字典LuaDictTable<string, int> dic = table.ToDictTable<string, int>();Dictionary<string, int> unitydic = dic.ToDictionary(); //打印如下var itor = unitydic.GetEnumerator();while (itor.MoveNext()){Debug.LogError("itor.Current.Key = " + itor.Current.Key + " ,itor.Current.Value = " + itor.Current.Value);}itor.Dispose();
多类型键值对表
表转成Dictionary
键值对的这种表必然是无法转成list,既然是键值对只能转成字典Dictionary
--lua中--table表现的dictionarythis.testDic = {["1"] = 1,[true] = 1,[false] = true,["123"] = false,[5] = "heiheihei"}//C#中//获取lua表的另一种获取方法//LuaTable table = LuaManager.lua.GetTable("UIMainCityCtrl.testDic");LuaDictTable<object,object> dic = table.ToDictTable<object, object>();Dictionary<object, object> unitydic = dic.ToDictionary(); var itor = unitydic.GetEnumerator();while (itor.MoveNext()){Debug.LogError("itor.Current.Key = " + itor.Current.Key + " ,itor.Current.Value = " + itor.Current.Value);}itor.Dispose();

总结
lua中的LuaTable、LuaArrayTable、LuaDictTable<K,V>这几个其实可以跟Unity中List和Dictionary相互转换。
后面会说一下距离怎么在C#中增删改查LuaTable、LuaArrayTable、LuaDictTable中的数据
相关文章:
LuaTable转C#的列表List和字典Dictionary
LuaTable转C#的列表List和字典Dictionaty 介绍lua中创建表测试lua中list表表转成List表转成Dictionary 键值对表表转成Dictionary 多类型键值对表表转成Dictionary 总结 介绍 之前基本都是从C#中的List或者Dictionary转成luaTable,很少会把LuaTable转成C#的List或者…...
Redis快速上手篇七(集群)
在赶工了..... Redis集群 主从复制的场景无法吗满足主机单点故障时需要引入集群配置 一般数据库要处理的读请求远大于写请求 ,针对这种情况,我们优化数据库可以采用读写分离的策略。我们可以部 署一台主服务器主要用来处理写请求,部署多台从…...
Mac 安装nvm
安装方案: 1. 从github下载nvm仓库到 ~/目录 地址:https://github.com/nvm-sh/nvm.git git clone https://github.com/nvm-sh/nvm.git 2. 进入nvm目录中执行install.sh等待执行完成,执行的操作方法就是直接将文件拖入到终端然后回车。 3.…...
python 从mssql取出datetime2类型之后格式化
我mssql是datetime2类型,用df取出之后发现是个纳秒的int(1698419713000000000 这种) 所以格式化的话就需要变成秒为单位,他们之间是10的9次方倍。所以先除以1e9之后用datetime.datetime.fromtimestamp()转换之后再format就行了 l…...
18.2 使用NPCAP库抓取数据包
NPCAP 库是一种用于在Windows平台上进行网络数据包捕获和分析的库。它是WinPcap库的一个分支,由Nmap开发团队开发,并在Nmap软件中使用。与WinPcap一样,NPCAP库提供了一些API,使开发人员可以轻松地在其应用程序中捕获和处理网络数据…...
pytest-yaml 测试平台-3.创建执行任务定时执行用例
前言 当项目用例编写完成后,需设置执行策略,可以用到定时任务设置每天几点执行。或者间隔几个小时执行一次。 创建定时任务 创建任务 勾选需要执行的项目以及运行环境 触发器可以支持2种方式:interval 间隔多久触发和 cron 表达式定时执行…...
安卓文件资源中,一个字串包含引用其他字串的写法
具体范例: <string name"product_name" translatable"false">Miscope</string><string name"app_name">string/product_name for USB Camera</string> 注意要先定义再引用。...
解决:谷歌浏览器访问http时,自动转https访问的问题
问题背景:某个系统网站,之前一直用https域名访问,现在改成http域名后,用http访问,谷歌浏览器会自动跳转到https。 解决方法: 在浏览器中输入网址:chrome://net-internals/#hsts -》 在“Delete…...
MQTT协议和边缘计算
1.基本概念 MQTT是基于TCP/IP协议栈构建的异步通信消息协议,是一种轻量级的发布、订阅信息传输协议。可以在不可靠的网络环境中进行扩展,适用于设备硬件存储空间或网络带宽有限的场景。使用MQTT协议,消息发送者与接收者不受时间和空间的限制…...
Redis(04)| 数据结构-压缩列表
压缩列表的最大特点,就是它被设计成一种内存紧凑型的数据结构,占用一块连续的内存空间,不仅可以利用 CPU 缓存,而且会针对不同长度的数据,进行相应编码,这种方法可以有效地节省内存开销。 但是,…...
516 最长回文子序列(区间DP)(灵神笔记)
题目 最长回文子序列 给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。 子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。 示例 1: 输入:s …...
Kafka - 异步/同步发送API
文章目录 异步发送普通异步发送异步发送流程Code 带回调函数的异步发送带回调函数的异步发送流程Code 同步发送API 异步发送 普通异步发送 需求:创建Kafka生产者,采用异步的方式发送到Kafka broker 异步发送流程 Code <!-- https://mvnrepository…...
嵌套for循环在外层循环和内层循环中使用两个Executors.newCachedThreadPool缓存线程池执行操作
1. 首先,我们需要创建两个ExecutorService对象,这两个对象将作为我们的缓存线程池。 2. 然后,我们使用嵌套的for循环来执行我们的操作。在每个外层循环中,我们将创建一个新的任务并提交给外层线程池。在这个任务中,我…...
【uniapp+云函数调用】人脸识别,实人认证,适用于app,具体思路解析,已实现
2023.10.8 需求: uniapp开发的app项目中使用人脸识别 app项目都是第一次搞,更别提人脸识别了。目前已有的就是Dcloud账号已申请,实现需求的时间没那么紧迫 此篇会详细记录从0到1的过程 2023.10.24 今天开始探究实现的过程 可能会记录的有些冗余 效果图如下: uniapp开发指南…...
系列十六、bean有哪些生命周期的回调方法?有哪几种实现方式?
一、概述 bean的生命周期的回调方法主要分两种,一种是初始化时进行调用,另外一种是销毁时进行调用。但是不管是初始化还是销毁,都对应着三种方式。 二、实现方式 2.1、注解方式 PostConstruct PreDestroy Component public class UserSe…...
2023平台工程崭露头角,AI 带来新机遇与挑战
在今年,平台工程正在迅速在 IT 企业中崭露头角,成为软件开发团队的必要实践。根据 CloudBees 发布的最新报告《2023年平台工程:快速采纳和影响》,83%的受访者已经完全实施了平台工程,或正处于某种实施阶段。 平台工…...
如何使用python快速修改Excel表单中的大量数据
python修改Excel中的内容进阶加速版 前面有一篇文章讲到了使用python处理Excel中的数据文件,即修改Excel中的数据,但是那个版本的代码跑点小规模、小数据量的excel还行,一旦数据量达到万条级别,代码运行会非常慢!因此&…...
✔ ★【备战实习(面经+项目+算法)】 10.27学习
✔ ★【备战实习(面经项目算法)】 坚持完成每天必做如何找到好工作1. 科学的学习方法(专注!效率!记忆!心流!)2. 每天认真完成必做项,踏实学习技术 认真完成每天必做&…...
视频分辨率/帧率/码率选择参考
1. 视频码率与分辨率的参考表 1080*720的分辨率,用5000K左右; 720*576的分辨率,用3500K左右; 640*480的分辨率,用1500K左右。 2. 计算公式 基本算法:码率(kb…...
LeetCode75——Day18
文章目录 一、题目二、题解 一、题目 1732. Find the Highest Altitude There is a biker going on a road trip. The road trip consists of n 1 points at different altitudes. The biker starts his trip on point 0 with altitude equal 0. You are given an integer …...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
React核心概念:State是什么?如何用useState管理组件自己的数据?
系列回顾: 在上一篇《React入门第一步》中,我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目,并修改了App.jsx组件,让页面显示出我们想要的文字。但是,那个页面是“死”的,它只是静态…...
Win系统权限提升篇UAC绕过DLL劫持未引号路径可控服务全检项目
应用场景: 1、常规某个机器被钓鱼后门攻击后,我们需要做更高权限操作或权限维持等。 2、内网域中某个机器被钓鱼后门攻击后,我们需要对后续内网域做安全测试。 #Win10&11-BypassUAC自动提权-MSF&UACME 为了远程执行目标的exe或者b…...
