Да - возьмите копию переменной внутри цикла:
while (variable < 5)
{
int copy = variable;
actions.Add(() => copy * 2);
++ variable;
}
Вы можете думать об этом, как если бы компилятор C # создавал «новую» локальную переменную каждый раз, когда он попадает в объявление переменной. На самом деле он создаст соответствующие новые объекты закрытия, и он становится сложным (с точки зрения реализации), если вы ссылаетесь на переменные в нескольких областях, но он работает:)
Обратите внимание, что более распространенное появление этого проблема заключается в использовании for
или foreach
:
for (int i=0; i < 10; i++) // Just one variable
foreach (string x in foo) // And again, despite how it reads out loud
Подробнее об этом см. в разделе 7.14.4.2 спецификации C # 3.0, а моя статья о замыканиях еще несколько примеров.
Поскольку доступ к разделу работает через ассоциации в Qlik, это было бы невозможно с вашей текущей моделью данных. У Марии нет нулевой машины - у нее нет ассоциации с автомобилем (которая будет отображаться как нуль, если вы поместите ПОЛЬЗОВАТЕЛЬ и АВТОМОБИЛЬ в таблицу, но это тонкая разница). Если вы структурировали свои данные несколько иначе, вы могли бы заставить его работать с пустым ... что-то вроде
car:
LOAD * INLINE
[
CAR,USER
GETZ,George
];
outer join(car):
LOAD * INLINE
[
USER
George
Maria
];
Возможно, вам понадобится заполнить пустые значения пустым потом ...
car2:
NOCONCATENATE LOAD
if(isnull(CAR),'',CAR) as CAR,
USER
Resident car;
drop table car;
Если невозможно присоединиться к двум таблицам, вы можете добавить пустые записи в свой автомобильный стол?
car:
LOAD
*,
USER as USER2
INLINE
[
CAR,USER
GETZ,George
];
person:
LOAD * INLINE
[
USER
George
Maria
];
concatenate(car)
LOAD
USER,
'' as CAR
RESIDENT person
WHERE NOT EXISTS (USER2,USER);
Есть также варианты с каким-то комбинированным ключом или applymaps потенциально, но мы надеемся, что одно из приведенных выше достаточно полезно ...