Выбрал математическую операцию с условием - PullRequest
0 голосов
/ 21 декабря 2011

У меня может быть странная проблема, но я постараюсь описать это.У меня есть выражение с двумя математическими операциями "%" и "/":

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 ]

5 голосов
/ 21 декабря 2011

Вы можете сделать что-то вроде этого:

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

На мой взгляд, это немного увеличивает сложность кода, поэтому может быть лучше придерживаться того, что у вас уже есть.

0 голосов
/ 21 декабря 2011

Возможно, это не лучшее решение, но я потратил время на написание кода, поэтому я могу также опубликовать его:

Определите эти два:

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 голосов
/ 21 декабря 2011

Просто используйте

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

Если у вас нет веских причин не делать этого, вы только вводите сложность без веской причины.Программное обеспечение является сложным, так как оно не представляет ненужной сложности.

0 голосов
/ 21 декабря 2011

Я думаю, что ваш метод верен, потому что нет никакого способа написать это, а также я не видел другого пути. так что используйте это два способа,

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

или

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

эти 2 метода хороши и достаточны для сокращения кода ...

...