前些日子在处理一段客户端数据时遇到这样一个问题,尝试了各种的循环遍历,结果都是不行,后来发现这段数据是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。
欢迎大佬吐槽.....