13.Lua调用C#的数据集合

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

×

喜欢就点赞,疼爱就打赏