ToLua的Example示例学习笔记09_Dictionary
2020-05-11 本文已影响0人
凌枫望星月
展示了Lua对C#中的Dictionary对象的几种基本访问方法。
「1」代码
操作代码如下:
function TestDict(map)
local iter = map:GetEnumerator()
while iter:MoveNext() do
local k = iter.Current.Key
local v = iter.Current.Value
print('Key:'..k..', id: '..v.id ..' name: '..v.name..' sex: '..v.sex)
end
local flag, account = map:TryGetValue(1, nil)
if flag then
print('TryGetValue result ok: '..account.name)
end
local keys = map.Keys
iter = keys:GetEnumerator()
print('------------print dictionary keys---------------')
while iter:MoveNext() do
print(iter.Current)
end
print('----------------------over----------------------')
local values = map.Values
iter = values:GetEnumerator()
print('------------print dictionary values---------------')
while iter:MoveNext() do
print(iter.Current.name)
end
print('----------------------over----------------------')
print('kick '..map[2].name)
map:Remove(2)
iter = map:GetEnumerator()
while iter:MoveNext() do
local v = iter.Current.Value
print('id: '..v.id ..' name: '..v.name..' sex: '..v.sex)
end
end
c#代码如下:
public sealed class TestAccount
{
public int id;
public string name;
public int sex;
public TestAccount(int id, string name, int sex)
{
this.id = id;
this.name = name;
this.sex = sex;
}
}
new LuaResLoader();
map.Add(1, new TestAccount(1, "水水", 0));
map.Add(2, new TestAccount(2, "王伟", 1));
map.Add(3, new TestAccount(3, "王芳", 0));
LuaState luaState = new LuaState();
luaState.Start();
BindMap(luaState);
luaState.DoString(script, "UseDictionary.cs");
LuaFunction func = luaState.GetFunction("TestDict");
func.BeginPCall();
func.Push(map);
func.PCall();
func.EndPCall();
func.Dispose();
func = null;
luaState.CheckTop();
luaState.Dispose();
luaState = null;
「2」需要了解的部分
TestAccount
是Lua不认的,所以这里要让Lua认识它,之前有两种方法,作者采取了手动绑定,我们通常使用另一种,这里的BindMap(luaState);
就是绑定的步骤之一,没见过的可以暂时不管,这个只是为了保证例子可以独立运行,平时的开发中只需要将需要的类型添加在在CustomSetting的列表之中即可。- 总之,默认传入Dictionary对象Lua是认可的即可。
- 通过迭代器iter的Current和Movenext来获取当前和下一个,从而遍历,注意Current是一个键值对,通过Key和Value来放访问。
while iter:MoveNext() do
local k = iter.Current.Key
local v = iter.Current.Value
print('Key:'..k..', id: '..v.id ..' name: '..v.name..' sex: '..v.sex)
end
- 可以通过类似
map:TryGetValue(1, nil)
与map:Remove(2)
等函数使用C#中的字典函数。 -
local keys = map.Keys
local values = map.Values
都可以认为是数组对象,可以遍历,其中Values是TestAccount对象数组。
字典函数:
Dictionary:get_Item() --获取与指定的键相关联的值
Dictionary:set_Item() --设置与指定的键相关联的值
Dictionary:Add() --将指定的键和值添加到字典中
Dictionary:Clear() --从 Dictionary中移除所有的键和值
Dictionary:ContainsKey() --确定 Dictionary是否包含指定的键
Dictionary:ContainsValue() --确定 Dictionary是否包含特定值
Dictionary:GetObjectData()
Dictionary:OnDeserialization()
Dictionary:Remove() --从 Dictionary中移除所指定的键的值
Dictionary:TryGetValue() --获取与指定的键相关联的值
Dictionary:GetEnumerator() --返回循环访问 Dictionary的枚举数
Dictionary:New() --这个是创建一个字典的方法
Dictionary.this --对象的this引用
Dictionary.__tostring --返回表示当前 Object的 String,这里其实并非C#对象的那个Tostring().而是作者自己重新等装的,但是效果类似,不用纠结,
--只不过不是方法而是对象了
Dictionary.Count --获取包含在 Dictionary中的键/值对的数
Dictionary.Comparer --获取用于确定字典中的键是否相
Dictionary.Keys --获取包含 Dictionary中的键的集合
Dictionary.Values --获取包含 Dictionary中的值的集合