传递操作符和其他参数

我有一些非常低效的代码,其中许多行出现4次,因为我通过“”操作以及各种变量和常量进行排列。 似乎有一种方法可以编写一次函数并传入运算符以及必要的变化值和“ref”变量。 我需要学习什么技巧? 有人建议“代表”,但我不知道如何以这种方式使用它们。 这是在C#2.0,VS2005中,但如果该技术是通用的并且也可以与C ++一起使用,那将是很好的。

请求一些代码:以下出现在许多伪装中,具有不同的“”符号以及“+”和“ – ”符号的混合:

if (move[check].Ypos - move[check].height / 200.0D < LayoutManager.VISIO_HEIGHT - lcac_c.top) { move[check].Ypos = move[check].Ypos + adjust; . . . 

在C ++中,使用std::lessstd::greater仿函数。 这两个方法都inheritance了std::binary_function ,因此您的generics函数应该接受此类型的实例。

在.NET中,等效于std::binary_functionFuncstd::lessstd::greater没有等价物,但创建它们相当简单。 请参阅以下示例。

 static class Functor { static Func Greater() where T : IComparable { return delegate(T lhs, T rhs) { return lhs.CompareTo(rhs) > 0; }; } static Func Less() where T : IComparable { return delegate(T lhs, T rhs) { return lhs.CompareTo(rhs) < 0; }; } } 

注意,上面的代码使用.NET 3.5中的Func<>类。 如果这是不可接受的,请考虑定义自己的委托。

C ++调用示例:

 void DoWork(const std::binary_function& myOperator, int arg1, int arg2) { if (myOperator(arg1, arg2)) { /* perform rest of work */ } } void main() { DoWork(std::less(), 100, 200); DoWork(std::greater(), 100, 200); } 

C#调用示例:

 void DoWork(Func myOperator, int arg1, int arg2) { if (myOperator(arg1, arg2)) { /* perform rest of work */ } } void main() { DoWork(Functor.Less(), 100, 200); DoWork(Functor.Greater(), 100, 200); } 

编辑 :我更正了仿函数类的示例,因为将<或>运算符应用于generics类型不起作用(以与C ++模板相同的方式)。

在C#中,使用委托将“ < ”和“ > ”操作传递给正在执行工作的代码。

C#示例:

 public delegate bool BooleanOperatorDelegate(int a, int b) class OperatorsImplementer { public bool OperatorLess(int a, int b) { return a < b; } } class AnotherOperatorsImplementer { public bool OperatorLess(int a, int b) { return (a + 1) < (b - 1); } } class OperatorUser { int DoSomethingObscene(int a, int b, BooleanOperatorDelegate operator) { if (operator(a, b)) { return 5; } else { return -5; } } } 

您还应该检查作为参数获得的委托不是NULL。

这是这样做的C方法:

 bool (*operator_func)(float a, float b) 

在Comparer类中定义Enum运算符之后

  public static class Comparer { public static bool IsTrue(T value1, Operator comparisonOperator, U value2) where T : U where U : IComparable { switch (comparisonOperator) { case Operator.GreaterThan: return value1.CompareTo(value2) > 0; case Operator.GreaterThanOrEqual: return value1.CompareTo(value2) >= 0; case Operator.LessThan: return value1.CompareTo(value2) < 0; case Operator.LessThanOrEqual: return value1.CompareTo(value2) <= 0; case Operator.Equal: return value1.CompareTo(value2) == 0; default: return false; } } public enum Operator { GreaterThan = 1, GreaterThanOrEqual = 2, LessThan = 3, LessThanOrEqual = 4, Equal = 5 } } 

你可以这样打个电话:

  if (IsTrue(var1, Operator.GreaterThanOrEqual, var2)) Console.WriteLine("var1 is greater than var2"); else Console .WriteLine("Unfortunately var1 is not greater than or equal var2. Sorry about that.");