选择有条件的数学运算

本文关键字:运算 有条件 选择 | 更新日期: 2023-09-27 18:18:25

我可能有一个奇怪的问题,但我会试着描述它。我有一个包含两个数学运算"%"answers"/"的表达式:

int a = x / y;
int a = x % y;

我有一个函数的参数,我检查,我必须为这个表达式实现什么数学运算符(%或/)。因此,如果有一种方法可以为表达式选择操作符,而不需要重复代码

int a = parameter ? x / y: x % y;

if (parameter) a = x/y; else a = x%y;

这对我来说是错误的。

是否有这样的用法:

int a = x (parameter ? / : %) y;

代码视觉问题:

items.Where((item, index) => 
                    settings.cbl_Direction == Direction.Horizontal ?
                        index / (int)settings.cbl_RepeatColumns == i 
                    :
                        index % (int)settings.cbl_RepeatColumns == i)

选择有条件的数学运算

你可以这样做:

Func<int, int, int> div = (m, n) => m / n;
Func<int, int, int> mod = (m, n) => m % n;
int a = (parameter ? div : mod)(x, y);

在我看来,这稍微增加了代码的复杂性,所以最好还是坚持使用现有的代码。

我认为你的方法是真的,因为没有任何方法来写这个,我也没有看到任何其他的方法。所以用这两种方式

int a = parameter ? x / y: x % y;

if (parameter) a = x/y; else a = x%y;

就用

if (parameter) a = x/y; else a = x%y; 

除非你有一个非常令人信服的理由不这样做,否则你只是在毫无理由地引入复杂性。如果没有引入不必要的复杂性,软件就是复杂的。

这可能不是最好的解决方案,但我花了很多时间来编写代码,所以我不妨发布它:

定义这两个:

private const string ClassString1 =
        @"
    namespace MyNamespace
    {
        public static class MyClass
        {
            public static int InvokeMath(int x, int y)
            {
                return ";
    private const string ClassString2 = @";
            }
        }
    }";

方法:

public static int MethodOperation(int x, int y, string @operator)
    {
        var sharpCom = new CSharpCodeProvider();
        var results = sharpCom.CompileAssemblyFromSource(new CompilerParameters { GenerateInMemory = true, GenerateExecutable = false }, ClassString1 + string.Format("x {0} y", @operator) + ClassString2);
        return (int)results.CompiledAssembly.GetTypes().First().GetMethods().First().Invoke(null, new object[] { x, y });
    }

像这样使用:

var divide = MethodOperation(2, 2, "/");
var mod = MethodOperation(2, 2, "%");

完全的代码重用,同时牺牲可读性、速度和其他一切你可以牺牲的东西!