美文网首页
ToLua的Example示例学习笔记09_Dictionary

ToLua的Example示例学习笔记09_Dictionary

作者: 凌枫望星月 | 来源:发表于2020-05-11 16:40 被阅读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中的值的集合
    

    相关文章

      网友评论

          本文标题:ToLua的Example示例学习笔记09_Dictionary

          本文链接:https://www.haomeiwen.com/subject/rugunhtx.html