Как скопировать структуру вложенного словаря в C # в Lua

#c# #dictionary #lua #nested #lua-table

#c# #словарь #lua #вложенный #lua-таблица

Вопрос:

Я пытался работать с таблицами в Lua и хотел скопировать в него часть моего кода с 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

  

Комментарии:

1. Dict[FR] = { [ET] = { {ElapsedTime}, {FB} } } нужна только эта строка, а не остальные, даже else

2. Для определенного значения FR, которое является моим первым ключом, и ET, которое является ключом второй таблицы, у меня будет несколько различных значений elapsedTime и FB, которые передаются с частотой 1 секунда. Идея, лежащая в основе приведенного выше кода Lua, заключалась в том, что сначала я проверю, есть ли какое-либо значение, связанное с ключом FR, в случае, если есть, я затем проверю, есть ли значение, связанное с ET. Если да, то я хочу добавить прошедшее время и FB к ранее существующим таблицам, соответствующим FR и ET. Смогу ли я достичь этого с помощью того, что вы предлагаете?

Ответ №1:

Ваш код lua стирает предыдущие записи, это потому, что вы неправильно задаете значение.

Когда вы делаете:

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

по сути, вы удаляете все другие записи в FR и в ET , это потому, что вы переопределяете значение в 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
  

Комментарии:

1. Как насчет функциональности добавления данных в список классов? Как и в моем C #-скрипте, я делаю это: Dict[FR][ET].Add(new FBDetails() {ElapsedTime = ElapsedTime, ActiveFB = FB}); Это позволяет получить доступ к значениям elapsedTime и ActiveFB на более позднем этапе путем обхода словаря, а затем запуска цикла for и выполнения чего-то подобного: double FB = Data[k].ActiveFB; Боюсь, что подобное невозможно в Lua или нет?

2. Если я вас правильно понимаю, да, можно сделать то, что вы сказали в Lua, если Data представляет некоторое Dict[FR][ET] , то вы используете ipairs для получения каждой таблицы изнутри ET и индексируете значение, чтобы получить ваше FB . Этот синтаксис { {ElapsedTime}, {FB} } не упрощает задачу, но его можно изменить на, { ElapsedTime = ElapsedTime, ActiveFB = FB } где текст перед = является ключевым

3. Да, { ElapsedTime = ElapsedTime, ActiveFB = FB } поможет делу. Спасибо!