LuaTable转C#的列表List和字典Dictionary

news2024/12/23 10:39:24

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表现的dictionary
    this.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表现的dictionary
    this.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中的数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1135986.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

openEuler 22.03 LTS编译安装libreoffice并制作rpm包——筑梦之路

环境说明 操作系统&#xff1a;华为欧拉操作系统openEuler 22.03 lts x86_64 libreoffice版本&#xff1a;当前最新版本7.6 编译安装过程 1. 安装编译工具和依赖包 sudo yum install -y snappy snappy-devel autoconf automake libtool git gcc gcc-c gcc-objc make cmake…

超全整理,服务端性能测试-docker部署tomcat/redis(详细步骤)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、docker部署tom…

全电注塑机硬件选型

电机选型&#xff08;方法&#xff09; 在伺服电机选型计算当中其主要数据包括&#xff1a;负载/ 电机惯量比&#xff0c;加减速力矩&#xff0c; 负载转矩&#xff0c;连续过载时间等。选择原则是&#xff1a;首先根据转矩&#xff0d;速度特性曲线检查负载转矩&#xff0c;加…

解决photoshop中不能输入蒙文的方法(附所有软件、字体)

效果预览&#xff1a; ps版本&#xff1a;Adobe Photoshop 2020 windows版本&#xff1a;windows 11专业版 蒙文字体选用&#xff1a;Menk Garqag Tig 蒙文输入法&#xff1a;蒙科立智能输入发下载地址&#xff1a;蒙科立-蒙古文AI&#xff08;人工智能&#xff09;引领者 …

跨境电商测评方式有哪些?

对于做跨境电商平台的卖家来说&#xff0c;如果想要提高销量&#xff0c;测评是一个必不可少的环节&#xff0c;因为前期自然流量很难带来什么销售额&#xff0c;所以很多卖家选择进行测评来提升产品的排名、权重和销量&#xff0c;并增加订单量、点赞、店铺评价和产品评价等指…

Studio One6.5版本要不要更新?哪些人需要更新?更新了哪些内容

对于声卡调试Studio One6.5版本&#xff0c;是否需要更新&#xff1f;这是一个需要考虑的问题。各位好&#xff0c;我是coco玛奇朵。 关于Studio One6.5版本要不要更新&#xff1f;哪些人需要更新&#xff1f;更新了哪些内容&#xff1f;对于这些问题&#xff0c;今天我们来详…

Redis快速上手篇(二)(操作与数据类型)

Key 默认 16 个数据库&#xff0c;类似数组下标从 0 开始&#xff0c;初始默认使用 0 号库 config get databases 查询数据库总数量 dbsize 查看当前数据库的 key 的数量 flushdb 清空当前库 flushall 通杀全部库 keys * 获取当前库中的所有key select 0 选择第一个库 move ke…

VS2022 C# 读取 excel 2023年

今天是2023年6月26日&#xff0c;我有一个excel表要读数据&#xff0c;然后放到winform程序来处理&#xff0c;网上的资料太旧&#xff0c;很多用不起来&#xff0c;试了一个可以使用&#xff0c;记录一下&#xff1a; 一、excel文件后缀需要小写。 二、用VS2022建一个winform…

关于腾讯云轻量应用服务器性能测评,看这一篇文章就够了

腾讯云轻量应用服务器性能如何&#xff1f;为什么便宜是不是性能不行&#xff1f;腾讯云百科txybk.com从轻量应用服务器的CPU型号、处理器主频、内存、公网带宽、月流量和系统盘多方面来详细测评轻量性能&#xff0c;轻量应用服务器性价比高&#xff0c;并不是性能不行&#xf…

rk3588 SD 卡镜像扩容

先用一个卡复制镜像 Win32DiskImager 操作: https://blog.csdn.net/FL1623863129/article/details/118945754 复制之后镜像正常工作 但是仍旧只能显示32G 扩容 下载安装gparted https://blog.csdn.net/weixin_44589540/article/details/121580883 resize 拖过来就完了…

如何实现Android视音频数据对接到GB28181平台(SmartGBD)

为什么要开发Android平台GB28181&#xff1f; 在做Android平台GB28181接入模块之前&#xff0c;我们在RTMP推送播放、RTSP轻量级服务、转发、播放这块&#xff0c;已经有很多年的经验&#xff0c;这意味着&#xff0c;我们不需要重复造轮子&#xff0c;已有屏幕、摄像头或编码…

Keil uVision 5 MDK版软件安装包下载及安装教程(最详细图文教程)

目录 一.简介 二.安装步骤 软件&#xff1a;Keil uvision5版本&#xff1a;MDKv518语言&#xff1a;中文/英文大小&#xff1a;377.01M安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.59GHz 内存4G(或更高&#xff09;下载通道①百度网盘丨64位下载链接…

【Linux】第三站:Linux基本指令(二)

文章目录 一、通配符 *二、man指令三、cp指令1.先给一个文件里面写入数据2. cp指令拷贝普通文件3.cp指令拷贝文件目录4.常用的选项总结 四、mv指令1.mv命令简介2.使用 五、一些插曲1.一些注意事项2.指令的本质3.再谈输出重定向4.追加重定向5.输入重定向 六、cat指令七、more指令…

liunx Centos-7.5上 rabbitmq安装

在安装rabbitmq中需要注意&#xff1a; 1、rabbitmq依赖于erlang&#xff0c;需要先安装erlang 2、erlang和rabbitmq版本有对应关系 可参考网页&#xff1a;https://www.rabbitmq.com/which-erlang.html 第一步&#xff0c;安装编译工具及库文件,如果服务器上已经有了&…

大事务导致数据库恢复时间长

背景 客户的一套系统从凌晨开始出现运行缓慢&#xff0c;重启SQL Server服务后一个主要的数据库一直处在正在恢复的状态&#xff0c;多次重启SQL Server服务和服务器无果后请我们协助处理。 现象 在SSMS中看到数据库是正在恢复的状态&#xff0c;而且不能被访问。 分析 启动SQ…

全球医疗产品畅销:跨境电商的生命科技

随着数字化时代的到来&#xff0c;跨境电商不仅仅是商业领域的一种革命性力量&#xff0c;更是生命科技行业的重要推动者。这一融合带来了全球医疗产品畅销的新时代&#xff0c;为世界各地的消费者带来了前所未有的便利和机会。本文将深入探讨这一跨境电商的生命科技领域&#…

C# 高级 <一>

一、 特性&#xff08;Attribute&#xff09; .NET 框架提供了三种预定义特性&#xff1a; AttributeUsageConditionalObsolete a. AttributeUsage 它描述了如何使用一个自定义特性类。它规定了特性可应用项目的类型。语法如下&#xff1a; [AttributeUsage(validon,AllowM…

万圣节倒计时:如何在TikTok上推动商品广告

万圣节是一个商机充足的季节&#xff0c;对于广告商和品牌来说&#xff0c;这是一个绝佳的机会。TikTok&#xff0c;作为一款全球短视频应用&#xff0c;提供了一个独特的平台&#xff0c;可以将商品广告巧妙地与万圣节元素结合&#xff0c;吸引年轻受众的注意力。本文将深入探…

想要完美录屏?这几款录屏大师,不容错过

在数字媒体和游戏产业的不断崛起下&#xff0c;屏幕录制技术变得越来越重要。无论是捕捉游戏精彩瞬间、创作教程视频&#xff0c;还是与朋友分享有趣时刻&#xff0c;录屏工具成为了当今数字生活不可或缺的一部分。本文将介绍三款好用的录屏大师&#xff0c;无论您是一位游戏爱…

Gartner:2024年优秀战略技术趋势

到2024年&#xff0c;人工智能将在企业中占据主导地位&#xff0c;而云服务、安全性和可持续性的影响力也将上升。 到2024年&#xff0c;人工智能将在企业中占据主导地位&#xff0c;而云服务、安全性和可持续性的影响力也将上升。 Gartner表示&#xff0c;人工智能和智能应用…