2011-12-21 59 views
0

我可能有一个奇怪的问题,但我会尽力去描述它。 我有两个数学运算“%”和“/”的表达式:选择条件的数学运算

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) 
+4

为什么'int a = parameter? x/y:x%y;'不够好? – ThePower 2011-12-21 13:21:44

+1

我认为你有点生存:)我不认为'int a =参数?x/y:x%y;'错了 – 2011-12-21 13:22:44

+0

这对于代码视觉来说看起来不太好:foreach(KeyValuePair item.Where((item,index)=> settings.cbl_Direction == Direction.Horizo​​ntal ? 指数/(INT)settings.cbl_RepeatColumns ==我 : 指数%(INT)settings.cbl_RepeatColumns == I)) – FSou1 2011-12-21 13:24:21

回答

5

你可以做这样的事情:

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); 

在我看来这会稍微增加代码的复杂性,所以最好坚持已有的代码。

+3

+1可爱,但与内联语句中使用“?:”并没有什么不同。 – Yuck 2011-12-21 13:22:54

+0

因此,我的代码应该是这样的:items.Where((item,index)=> (settings.cbl_Direction == Direction.Horizo​​ntal?div:mod)(index,(int)settings.cbl_RepeatColumns)== i) :) – FSou1 2011-12-21 13:30:15

+0

@ FSou1:你*可以*做到这一点,但我可能不会这样做。请考虑使用'let'子句删除重复的表达式:http://msdn.microsoft.com/en-us/library/bb383976.aspx – 2011-12-21 13:32:58

0

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

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

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

这2个方法是好的,足以减少代码...

0

只需使用

​​

除非你有一个非常有说服力的理由不这样做,你只是没有理由地引入复杂性。 软件是复杂的,因为它没有引入不必要的复杂性。

0

这可能不是最好的解决办法,但我花了时间写代码,所以我可能藏汉张贴:

定义这两个:

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, "%"); 

完全重复使用代码,同时牺牲可读性,速度以及几乎所有可以牺牲的部分!

+0

哇......... :) – FSou1 2011-12-21 15:23:25