Код: Выделить всё
(Func getFn, Action setFn) MakePair(T initialVal) {
}
Мой Текущее решение состоит в том, чтобы динамически создавать массив типа с одним элементом и ссылаться на него:
Код: Выделить всё
(Func getFn, Action setFn) MakePair(T initialVal) {
var dynvar = Array.CreateInstance(typeof(T), 1);
Expression f = () => dynvar;
var dynref = Expression.Convert(f.Body, typeof(T).MakeArrayType());
var e0 = Expression.Constant(0);
var getBody = Expression.ArrayIndex(dynref, e0);
var setParam = Expression.Parameter(typeof(T));
var setBody = Expression.Assign(Expression.ArrayAccess(dynref, e0), setParam);
var getFn = Expression.Lambda(getBody).Compile();
var setFn = Expression.Lambda(setBody, setParam).Compile();
return (getFn, setFn);
}
Есть ли лучший способ ссылаться на массив, созданный во время выполнения, кроме использования лямбда-выражения для создания ссылки (поля?) для использования в ArrayIndex/
Код: Выделить всё
ArrayAccessИзбыточная справочная информация
Для тех, кому интересно: в конечном итоге это возникло в результате попытки создать что-то вроде Perl auto -оживление значений lvalue для хешей Perl.
Представьте, что у вас есть список с повторяющимися элементами и вы хотите создать словарь, который позволяет вам найти количество каждого уникального T в списке. Для подсчета можно использовать несколько строк кода (в данном случае T — это int):
Код: Выделить всё
var countDict = new Dictionary();
foreach (var n in testarray) {
countDict.TryGetValue(n, out int c);
countDict[n] = c + 1;
}
Код: Выделить всё
var countDict = testarray.Aggregate(new Dictionary(), (d, n) => { ++d[n]; return d; });
Код: Выделить всё
var countDict = testarray.Aggregate(new SeedDictionary(() => Ref.Of(() => 0)), (d, n) => { var r = d[n]; ++r.Value; return d; });
Но теперь у вас есть проблема с созданием нескольких целочисленных переменных времени выполнения для хранения счетчиков. Я расширил класс Ref, включив в него лямбду, возвращающую константу (
Код: Выделить всё
ConstantExpressionПодробнее здесь: https://stackoverflow.com/questions/541 ... at-runtime
Мобильная версия