13.Lua调用CSharp-数据集合
13.1 知识点
准备工作
LuaManager.Instance.Init();
LuaManager.Instance.DoLuaFile("Lesson14_Lua调用CSharp_数据集合");
基本方法概述
对于数据集合
在C#中怎么使用,就在Lua中使用对应的C#方法,而不遵循Lua的语法规则,除非Lua完全无法使用对应的C#方法。
准备用于测试的类
// 需要在CustomSetting中去加上绑定 然后生成代码
public class Lesson13_TestDataCollectionsClass
{
public int[] array = new int[5] { 1, 2, 3, 4, 5 };
public List<int> list = new List<int>();
public Dictionary<int, string> dictionary = new Dictionary<int, string>();
}
实例化测试数据集合类
--实例化测试数据集合类 需要在CustomSetting中去加上绑定 然后生成代码
local testDataCollectionsClass = Lesson13_TestDataCollectionsClass()
注意事项
假如修改了类,类中添加了其他类型集合,例如 List、Dictionary,可能出现报错,因为修改了没生成 toLua 不认识,需要重新生成代码。
数组
--数组长度 数组.Length 不能使用#去获取长度
print(testDataCollectionsClass.array.Length) --5
--访问元素 数组[索引]
print(testDataCollectionsClass.array[0]) --1
--修改元素 数组[索引] = 新值
testDataCollectionsClass.array[0] = 111
print(testDataCollectionsClass.array[0]) --111
--查找元素
print(testDataCollectionsClass.array:IndexOf(111)) --0
--遍历数组 要遵循C#的规则 从0开始 到数组长度-1结束
--虽然lua中的索引从1开始 但是因为使用的是C#数组 不遵循Lua的语法规则
for i = 0, testDataCollectionsClass.array.Length - 1 do
print(testDataCollectionsClass.array[i])
end
--迭代器遍历
local iter = testDataCollectionsClass.array:GetEnumerator()
while iter:MoveNext() do
print("iter:" .. iter.Current)
end
--使用toLua提供的ToTable方法 把数组转table再遍历
local t = testDataCollectionsClass.array:ToTable()
for i = 1, #t do
print("table: " .. tostring(t[i]))
end
--创建数组对象 使用系统的数组类的CreateInstance方法 传入元素类型和初始化长度
--数组的本质是系统定义好的类 Int32可能系统不认识 需要在CustomSetting中去加上绑定
local myArray = System.Array.CreateInstance(typeof(System.Int32), 10)
print(myArray.Length) --10
print(myArray[0]) --0
myArray[1] = 1
print(myArray[1]) --1
--数组内存地址 直接print(数组)
print(myArray) --userdata:0x2613508D9A8
List
--添加List元素 调用List的成员方法Add 注意成员方法要使用:调用
testDataCollectionsClass.list:Add(1)
testDataCollectionsClass.list:Add(2)
testDataCollectionsClass.list:Add(3)
--得到List元素 List[索引]
print(testDataCollectionsClass.list[0]) --1
--List长度 List.Count
print(testDataCollectionsClass.list.Count) --3
--遍历List 要遵循C#的规则 从0开始 到数组长度-1结束
for i = 0, testDataCollectionsClass.list.Count - 1 do
print(testDataCollectionsClass.list[i]) --1 2 3
end
--toLua不支持索引器直接修改List元素
-- testDataCollectionsClass.list[0] = 1111--报错
--移除List元素 调用List的成员方法Remove 注意成员方法要使用:调用
testDataCollectionsClass.list:Remove(1)
for i = 0, testDataCollectionsClass.list.Count - 1 do
print(testDataCollectionsClass.list[i]) --2 3
end
--List内存地址 直接print(List)
print(testDataCollectionsClass.list) --userdata:0x26137B665A0
--创建List对象
--toLua中对泛型的支持比较糟糕 想要用什么泛型类型的对象 都需要在CustomSetting中去添加对应类型才能使用
--例如想创建字符串型的List 需要添加 _GT(typeof(List<string>)),
local listString = System.Collections.Generic.List_string()
listString:Add("韬老师")
print(listString[0]) --韬老师
Dictionary
--添加Dictionary元素 调用Dictionary的成员方法Add 注意成员方法要使用:调用
testDataCollectionsClass.dictionary:Add(1, "111")
testDataCollectionsClass.dictionary:Add(2, "222")
testDataCollectionsClass.dictionary:Add(6, "666")
--得到Dictionary元素 Dictionary[键]
print(testDataCollectionsClass.dictionary[1]) --111
--遍历Dictionary 由于Lua没有foreach 且由于toLua不支持pairs遍历 需要使用迭代器遍历
--遍历键值对
local iter = testDataCollectionsClass.dictionary:GetEnumerator()
while iter:MoveNext() do
local v = iter.Current.Value
print("键值对" .. iter.Current.Key .. "_" .. iter.Current.Value)
end
--遍历键
local keyIter = testDataCollectionsClass.dictionary.Keys:GetEnumerator()
while keyIter:MoveNext() do
print("键" .. keyIter.Current)
end
--遍历值
local valueIter = testDataCollectionsClass.dictionary.Values:GetEnumerator()
while valueIter:MoveNext() do
print("值" .. valueIter.Current)
end
--修改Dictionary元素 Dictionary[键] = 新值
testDataCollectionsClass.dictionary[1] = "111111"
print(testDataCollectionsClass.dictionary[1]) --111111
--移除Dictionary元素 调用Dictionary的成员方法Remove 注意成员方法要使用:调用
testDataCollectionsClass.dictionary:Remove(1)
local iter = testDataCollectionsClass.dictionary:GetEnumerator()
while iter:MoveNext() do
print("键值对" .. iter.Current.Key .. "_" .. iter.Current.Value)
end
-- print(testDataCollectionsClass.dictionary[1])--报错
--创建Dictionary对象
--toLua中对泛型的支持比较糟糕 想要用什么泛型类型的对象 都需要在CustomSetting中去添加对应类型才能使用
-- 例如
-- _GT(typeof(Dictionary<int, string>)),
-- _GT(typeof(Dictionary<string, int>)),
--创建 int键 string值 的 Dictionary对象
local myDictionary1 = System.Collections.Generic.Dictionary_int_string()
myDictionary1:Add(666666, "123")
print(myDictionary1[666666]) --123
--创建 string值 int键 的 Dictionary对象
local myDictionary2 = System.Collections.Generic.Dictionary_string_int()
myDictionary2:Add("123", 66666)
-- print(dictionary_int_string["123"])--报错 不支持直接传入字符串键
--遍历查看键值对
local iter = myDictionary2:GetEnumerator()
while iter:MoveNext() do
print("键值对" .. iter.Current.Key .. "_" .. iter.Current.Value) --:键值对123_66666
end
--TryGetValue成员方法 返回是否有该键 有的话返回该键的值
local b,v = myDictionary1:TryGetValue(666666,nil)
print(b)--true
print(v)--123
local b,v = myDictionary2:TryGetValue("123",nil)
print(b)--true
print(v)--666666
13.2 知识点代码
Lesson13_Lua调用CSharp_数据集合.lua
print('我是Lua脚本 Lesson13_Lua调用CSharp_数据集合')
print("**********知识点一 基本方法概述************")
--对于数据集合 在C#怎么使用 在Lua就使用C#对应的方法 而不遵循Lua的语法规则 除非Lua完全无法使用对应的C#方法
--实例化测试数据集合类 需要在CustomSetting中去加上绑定 然后生成代码
local testDataCollectionsClass = Lesson13_TestDataCollectionsClass()
--假如修改了类 类中添加了其他了类型集合 例如List Dictionary 可能出现报错 因为修改了没生成toLua不认识 需要重新生成代码
print("**********知识点二 数组************")
--数组长度 数组.Length 不能使用#去获取长度
print(testDataCollectionsClass.array.Length) --5
--访问元素 数组[索引]
print(testDataCollectionsClass.array[0]) --1
--修改元素 数组[索引] = 新值
testDataCollectionsClass.array[0] = 111
print(testDataCollectionsClass.array[0]) --111
--查找元素
print(testDataCollectionsClass.array:IndexOf(111)) --0
--遍历数组 要遵循C#的规则 从0开始 到数组长度-1结束
--虽然lua中的索引从1开始 但是因为使用的是C#数组 不遵循Lua的语法规则
for i = 0, testDataCollectionsClass.array.Length - 1 do
print(testDataCollectionsClass.array[i])
end
--迭代器遍历
local iter = testDataCollectionsClass.array:GetEnumerator()
while iter:MoveNext() do
print("iter:" .. iter.Current)
end
--使用toLua提供的ToTable方法 把数组转table再遍历
local t = testDataCollectionsClass.array:ToTable()
for i = 1, #t do
print("table: " .. tostring(t[i]))
end
--创建数组对象 使用系统的数组类的CreateInstance方法 传入元素类型和初始化长度
--数组的本质是系统定义好的类 Int32可能系统不认识 需要在CustomSetting中去加上绑定
local myArray = System.Array.CreateInstance(typeof(System.Int32), 10)
print(myArray.Length) --10
print(myArray[0]) --0
myArray[1] = 1
print(myArray[1]) --1
--数组内存地址 直接print(数组)
print(myArray) --userdata:0x2613508D9A8
print("**********知识点三 List***********")
--添加List元素 调用List的成员方法Add 注意成员方法要使用:调用
testDataCollectionsClass.list:Add(1)
testDataCollectionsClass.list:Add(2)
testDataCollectionsClass.list:Add(3)
--得到List元素 List[索引]
print(testDataCollectionsClass.list[0]) --1
--List长度 List.Count
print(testDataCollectionsClass.list.Count) --3
--遍历List 要遵循C#的规则 从0开始 到数组长度-1结束
for i = 0, testDataCollectionsClass.list.Count - 1 do
print(testDataCollectionsClass.list[i]) --1 2 3
end
--toLua不支持索引器直接修改List元素
-- testDataCollectionsClass.list[0] = 1111--报错
--移除List元素 调用List的成员方法Remove 注意成员方法要使用:调用
testDataCollectionsClass.list:Remove(1)
for i = 0, testDataCollectionsClass.list.Count - 1 do
print(testDataCollectionsClass.list[i]) --2 3
end
--List内存地址 直接print(List)
print(testDataCollectionsClass.list) --userdata:0x26137B665A0
--创建List对象
--toLua中对泛型的支持比较糟糕 想要用什么泛型类型的对象 都需要在CustomSetting中去添加对应类型才能使用
--例如想创建字符串型的List 需要添加 _GT(typeof(List<string>)),
local listString = System.Collections.Generic.List_string()
listString:Add("韬老师")
print(listString[0]) --韬老师
print("*********知识点四 Dictionary***********")
--添加Dictionary元素 调用Dictionary的成员方法Add 注意成员方法要使用:调用
testDataCollectionsClass.dictionary:Add(1, "111")
testDataCollectionsClass.dictionary:Add(2, "222")
testDataCollectionsClass.dictionary:Add(6, "666")
--得到Dictionary元素 Dictionary[键]
print(testDataCollectionsClass.dictionary[1]) --111
--遍历Dictionary 由于Lua没有foreach 且由于toLua不支持pairs遍历 需要使用迭代器遍历
--遍历键值对
local iter = testDataCollectionsClass.dictionary:GetEnumerator()
while iter:MoveNext() do
local v = iter.Current.Value
print("键值对" .. iter.Current.Key .. "_" .. iter.Current.Value)
end
--遍历键
local keyIter = testDataCollectionsClass.dictionary.Keys:GetEnumerator()
while keyIter:MoveNext() do
print("键" .. keyIter.Current)
end
--遍历值
local valueIter = testDataCollectionsClass.dictionary.Values:GetEnumerator()
while valueIter:MoveNext() do
print("值" .. valueIter.Current)
end
--修改Dictionary元素 Dictionary[键] = 新值
testDataCollectionsClass.dictionary[1] = "111111"
print(testDataCollectionsClass.dictionary[1]) --111111
--移除Dictionary元素 调用Dictionary的成员方法Remove 注意成员方法要使用:调用
testDataCollectionsClass.dictionary:Remove(1)
local iter = testDataCollectionsClass.dictionary:GetEnumerator()
while iter:MoveNext() do
print("键值对" .. iter.Current.Key .. "_" .. iter.Current.Value)
end
-- print(testDataCollectionsClass.dictionary[1])--报错
--创建Dictionary对象
--toLua中对泛型的支持比较糟糕 想要用什么泛型类型的对象 都需要在CustomSetting中去添加对应类型才能使用
-- 例如
-- _GT(typeof(Dictionary<int, string>)),
-- _GT(typeof(Dictionary<string, int>)),
--创建 int键 string值 的 Dictionary对象
local myDictionary1 = System.Collections.Generic.Dictionary_int_string()
myDictionary1:Add(666666, "123")
print(myDictionary1[666666]) --123
--创建 string值 int键 的 Dictionary对象
local myDictionary2 = System.Collections.Generic.Dictionary_string_int()
myDictionary2:Add("123", 66666)
-- print(dictionary_int_string["123"])--报错 不支持直接传入字符串键
--遍历查看键值对
local iter = myDictionary2:GetEnumerator()
while iter:MoveNext() do
print("键值对" .. iter.Current.Key .. "_" .. iter.Current.Value) --:键值对123_66666
end
--TryGetValue成员方法 返回是否有该键 有的话返回该键的值
local b,v = myDictionary1:TryGetValue(666666,nil)
print(b)--true
print(v)--123
local b,v = myDictionary2:TryGetValue("123",nil)
print(b)--true
print(v)--666666
Lesson13_Lua调用CSharp_数据集合
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson13_Lua调用CSharp_数据集合 : MonoBehaviour
{
void Start()
{
LuaManager.Instance.Init();
LuaManager.Instance.Require("Lesson13_Lua调用CSharp_数据集合");
}
}
public class Lesson13_TestDataCollectionsClass
{
public int[] array = new int[5] { 1, 2, 3, 4, 5 };
public List<int> list = new List<int>();
public Dictionary<int, string> dictionary = new Dictionary<int, string>();
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com