Может быть несколько пересечений, вы можете найти точку (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
, два значения могут быть не совсем одинаковыми, поэтому вы можете использовать некоторый допуск вместо ==
.
Вы можете упростить свой код с другой перегрузкой 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"