#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 }
поможет делу. Спасибо!