如何构建动态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
{
}
我只想在一个声明中说明这一点。 我必须为此构建一个结构吗?
一个例子很好。
答案 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