如何将C#中的嵌套Dictionary结构复制到Lua

问题描述

我试图在Lua中使用Tables,并想将我的一段代码从C#复制到其中。其中,我曾使用嵌套词典来完成任务,但在Lua中却无法实现。

这是我要复制的C#代码

public class FBDetails
{
     public double elapsedtime { get; set; }
     public double AFB{ get; set; }
}
    
public void AddFBDetails(Dictionary<double,Dictionary<DateTime,List<FBDetails>>> Dict,double FR,DateTime ET,double elapsedtime,double FB)
{
    if (!Dict.ContainsKey(FR))
    {
        Dict.Add(FR,new Dictionary<DateTime,List<FBDetails>>());
    }

    if (!Dict[FR].ContainsKey(ET))
    {   
        Dict[FR].Add(ET,new List<FBDetails>());
        Dict[FR][ET].Add(new FBDetails() {elapsedtime = elapsedtime,ActiveFB = FB});
    }
    else
    {
        Dict[FR][ET].Add(new FBDetails() {elapsedtime = elapsedtime,ActiveFB = FB});
    }
}

到目前为止,我已经编写的Lua代码(我知道这是错误的)在下面。 PS:到目前为止,我对Lua中的功能还不太熟悉,所以只专注于正确设置数据结构,但是如果有人也可以帮助使用该功能,我将不胜感激。


Dict = {} 

if Dict[FR] == nil then
    Dict { [FR] = {} }
end

if Dict[FR][ET] == nil then
    Dict[FR] = { [ET] = {} }
    Dict[FR] = { [ET] = { {elapsedtime},{FB} } } 
else
    Dict[FR] = { [ET] = { {elapsedtime},{FB} } } 
end

解决方法

您的lua代码正在清除以前的条目,这是因为您没有正确设置该值。

操作时:

Dict[FR] = { [ET] = { {ElapsedTime},{FB} } } 

实际上,您正在删除FRET中的所有其他条目,这是因为您在说FR时在Dict[FR] = {...上重新定义了值

当您这样做时同样如此:

Dict = { [FR] = {} }

您要重新定义Dict,以清除除当前FR以外的所有其他条目


您的lua应该为=之前的值编制索引。也可以简化。

function AddFBDetails(Dict,FR,ET,ElapsedTime,FB)
  if Dict[FR] == nil then
      Dict[FR] = {[ET] = {}}
  elseif Dict[FR][ET] == nil then
    Dict[FR][ET] = {}
  end

  table.insert(Dict[FR][ET],{ {ElapsedTime},{FB} })
end