构建动态if语句?

时间:2014-04-15 19:46:02

标签: c# visual-studio-2012 if-statement dynamic

如何构建动态if语句,其中还包括<,>,==,< =,> = 我想构建一个看起来不像这样的动态if语句:

if (seconds < choosedSeconds)
{

}
else if (seconds > choosedSeconds)
{

}
else if(seconds >= choosedSeconds)
{

}
else if(seconds == choosedSeconds)
{

}

这就是我希望它看起来像

if(seconds myOperator choosedSeconds) // or minutes, hours and so on
{

}

我只想在一个声明中说明这一点。 我必须为此构建一个结构吗?

一个例子很好。

5 个答案:

答案 0 :(得分:2)

interface IMyConditionEvaluator 
{
    bool EvaluateCondition(int x, int y); 
}

…

IMyConditionEvaluator e = new SomeSpecificConditionEvaluator();

…

if (e.EvaluateCondition(seconds, choosedSeconds))
{
    …
}

现在继续创建尽可能多的实现IMyConditionEvaluator的类。

答案 1 :(得分:2)

您可以使用委托和lambda表达式

void MyMethod (Func<int, int, bool> comparison)
{
    int seconds = ...;
    int chosenSeconds = ...;

    if (comparison(seconds, chosenSeconds)) {
        ...
    }
}

你可以这样称呼它

MyMethod((a, b) => a <= b);

MyMethod((a, b) => a == b);

只要表达式是布尔表达式,任何比较都会起作用:

MyMethod((a, b) => a % b == 0);
MyMethod((a, b) => array[a] == 100 * b + 7);

答案 2 :(得分:2)

您可以使用predicates,即:

public bool IsExactlyOneSecond(TimeSpan timeSpan)
{
    return timeSpan.TotalSeconds == 1.0;
}

public bool IsMoreThanOneSecond(TimeSpan timeSpan)
{
    return timeSpan.TotalSeconds > 1.0;
}

然后你可能有一些方法将谓词作为输入:

private void Process(TimeSpan timeSpan, Predicate<TimeSpan> test)
{
    if (test(timeSpan))
    {
        // Do something
    }
}

你这样使用它:

Process(timeSpan, IsExactlyOneSecond);

或者

Process(timeSpan, IsMoreThanOneSecond);

答案 3 :(得分:1)

也许你需要这样的东西?此泛型方法使用指定的比较类型比较两个值。

public enum ComparisonType
{
    Equal,
    Less,
    Greater,
    LessOrEqual,
    GreaterOrEqual
}

public static bool Compare<T>(T a, ComparisonType compType, T b)
    where T : IComparable<T>
{
    switch (compType)
    {
        case ComparisonType.Equal:
            return a.CompareTo(b) == 0;
        case ComparisonType.Less:
            return a.CompareTo(b) < 0;
        case ComparisonType.Greater:
            return a.CompareTo(b) > 0;
        case ComparisonType.LessOrEqual:
            return a.CompareTo(b) <= 0;
        case ComparisonType.GreaterOrEqual:
            return a.CompareTo(b) >= 0;
    }
    throw new ApplicationException();
}

用法示例:

if (Compare(seconds, ComparisonType.LessOrEqual, choosenSeconds))
{
    // seconds <= choosenSeconds here
}

答案 4 :(得分:-4)

看一看 Expression Trees