Как построить ранжированное выражение регистра переключателя во время выполнения? [Дубликат]

Может быть несколько пересечений, вы можете найти точку (x,y) на каждом пересечении следующим пониманием списка

intersections = [(x[i], f[i]) for i,_ in enumerate(zip(f,g)) if f[i] == g[i]]

. В качестве простого примера

>>> x = [1,2,3,4,5]
>>> f = [2,4,6,8,10]
>>> g = [10,8,6,4,2]
>>> [(x[i], f[i]) for i,_ in enumerate(zip(f,g)) if f[i] == g[i]]
[(3, 6)]

So это нашло точку пересечения в x = 3, y = 6. Обратите внимание, что если вы используете float, два значения могут быть не совсем одинаковыми, поэтому вы можете использовать некоторый допуск вместо ==.

0
задан TVOHM 16 January 2019 в 10:14
поделиться

1 ответ

Вы можете упростить свой код с другой перегрузкой Expression.SwitchCase

Просто создайте массив с тестовыми значениями и преобразуйте его в ConstantExpression. Попробуйте этот пример:

var writeLine = typeof(Console).GetMethod("WriteLine", new[] {typeof(string)});

// body of first block
var action1 = Expression.Call(writeLine, Expression.Constant("1 or 2"));
// body of second block
var action2 = Expression.Call(writeLine, Expression.Constant("3, 4 or 5"));

var value = Expression.Parameter(typeof(int), "value");
var body = Expression.Switch(value,
    Expression.SwitchCase(
      action1,
      new[] {1, 2}.Select(i => Expression.Constant(i))),
    Expression.SwitchCase(
      action2, 
      new[] {3, 4, 5}.Select(i => Expression.Constant(i)))
);

var lambda = Expression.Lambda<Action<int>>(body, value);
var method = lambda.Compile();

method(1); // print "1 or 2"
method(4); // print "3, 4 or 5"
0
ответ дан Aleks Andreev 16 January 2019 в 10:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: