选择有条件的数学运算
本文关键字:运算 有条件 选择 | 更新日期: 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, "%");
完全的代码重用,同时牺牲可读性、速度和其他一切你可以牺牲的东西!