XLua—在Lua中遍历C#的Dictionary

前些日子在处理一段客户端数据时遇到这样一个问题,尝试了各种的循环遍历,结果都是不行,后来发现这段数据是C#的dictionary。


我们在Lua中可以通过获取迭代器的方式来遍历C#的dictionary。

废话不多说,直接上代码:

local playerInfo = CS.SG.PlayerData.Instance.Infos        --C#的dictionary
local iter = playerInfo:GetEnumerator()        --获取迭代器
while iter:MoveNext() do                           --只要movenext指针不为空,就一直迭代
    local v = iter.Current.Value
    DoFuction(v)                                 --获取到就可以进行操作了
end

后来,把这个提取了一下写了个public的工具,用来将dictionary转成table

CommonFunction.DicToTable = function(CSharpDic)
	local dic = {}
	local index =1
	local iter = CSharpDic:GetEnumerator()	
	while iter:MoveNext() do
		local v = iter.Current.Value
		dic[index] = v
		index = index + 1
	end
	return dic
end

大功告成。

需要注意一点的是,在XLua中通过获取迭代器的方式来遍历C#的字典是很费的操作,最好在C#中加一个静态方法,在C#中将Dictionary转为数组,然后再取数据。

public class Tooools
    {
        public static object[] GetDicValue(Dictionary<object, object> dic)
        {
            if (dic.Count > 0)
            {
                object[] info = new object[dic.Count];//要是获取key和value就用二维数组
                int i = 0;
                foreach (var item in dic)
                {
                    info[i] = item.Value;
                    i = i + 1;
                }
                return info;
            }
            else
            {
                return null;
            }
        }
    }

这时候再取数据

local playerInfo = CS.SG.PlayerData.Instance.Infos        --C#的dictionary
local info = CS.SG.Tools.GetDicValue(playerInfo)    --获取到需要的数据

当然出于节约性能的考虑,还是在c#转为数组,然后在push进lua。

欢迎大佬吐槽.....

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值