C# 将运算符与其他参数一起传递
我有一些非常低效的代码,当我使用“”操作和各种变量和常量进行排列时,许多行出现了4次。似乎有一种方法可以编写函数一次,并将运算符与必要的更改值和“ref”变量一起传递。我必须学习什么技巧?有人建议使用“代表”,但我不知道如何以这种方式使用它们。这是在C 2中,VS2005,但是如果该技术是通用的,并且也可以与C++一起使用,那就太好了。 请求一些代码:以下代码以多种形式出现,带有不同的“”符号以及“+”和“-”符号的组合:C# 将运算符与其他参数一起传递,c#,c++,visual-studio,delegates,C#,C++,Visual Studio,Delegates,我有一些非常低效的代码,当我使用“”操作和各种变量和常量进行排列时,许多行出现了4次。似乎有一种方法可以编写函数一次,并将运算符与必要的更改值和“ref”变量一起传递。我必须学习什么技巧?有人建议使用“代表”,但我不知道如何以这种方式使用它们。这是在C 2中,VS2005,但是如果该技术是通用的,并且也可以与C++一起使用,那就太好了。 请求一些代码:以下代码以多种形式出现,带有不同的“”符号以及“+”和“-”符号的组合: if(move[check].Ypos-move[check].heig
if(move[check].Ypos-move[check].height/200.0D
在C#中,使用委托将“
”操作传递给执行工作的代码
C#示例:
在C++中,使用函数和函数。这两种方法都继承了,所以泛型函数应该接受这种类型的实例。
在.NET中,与std::binary_函数
等价的是。没有与std::less
和std::greater
等价的函数,但创建它们非常简单。请参见以下示例
static class Functor
{
static Func<T, T, bool> Greater<T>()
where T : IComparable<T>
{
return delegate(T lhs, T rhs) { return lhs.CompareTo(rhs) > 0; };
}
static Func<T, T, bool> Less<T>()
where T : IComparable<T>
{
return delegate(T lhs, T rhs) { return lhs.CompareTo(rhs) < 0; };
}
}
静态类函子
{
静态函数大于()
其中T:i可比较
{
返回委托(tlhs,trhs){return lhs.CompareTo(rhs)>0;};
}
静态Func Less()
其中T:i可比较
{
返回委托(tlhs,trhs){返回lhs.CompareTo(rhs)<0;};
}
}
<>注意,上面的代码使用.NET中的<代码> FUNC< /代码>类。如果这是不可接受的,请考虑定义自己的委托。
C++调用示例:
void DoWork(const std::binary_function<int, int, bool>& myOperator,
int arg1, int arg2)
{
if (myOperator(arg1, arg2)) { /* perform rest of work */ }
}
void main()
{
DoWork(std::less<int>(), 100, 200);
DoWork(std::greater<int>(), 100, 200);
}
void DoWork(Func<int, int, bool> myOperator, int arg1, int arg2)
{
if (myOperator(arg1, arg2)) { /* perform rest of work */ }
}
void main()
{
DoWork(Functor.Less<int>(), 100, 200);
DoWork(Functor.Greater<int>(), 100, 200);
}
void DoWork(const std::binary_函数和myOperator,
整数arg1,整数arg2)
{
如果(myOperator(arg1,arg2)){/*执行其余工作*/}
}
void main()
{
销钉(标准::less(),100200);
销钉(标准::更大(),100200);
}
C#调用示例:
void DoWork(const std::binary_function<int, int, bool>& myOperator,
int arg1, int arg2)
{
if (myOperator(arg1, arg2)) { /* perform rest of work */ }
}
void main()
{
DoWork(std::less<int>(), 100, 200);
DoWork(std::greater<int>(), 100, 200);
}
void DoWork(Func<int, int, bool> myOperator, int arg1, int arg2)
{
if (myOperator(arg1, arg2)) { /* perform rest of work */ }
}
void main()
{
DoWork(Functor.Less<int>(), 100, 200);
DoWork(Functor.Greater<int>(), 100, 200);
}
void DoWork(Func myOperator,int arg1,int arg2)
{
如果(myOperator(arg1,arg2)){/*执行其余工作*/}
}
void main()
{
DoWork(Functor.Less(),100200);
DoWork(Functor.Greater(),100200);
}
<> > >编辑< <强>:我纠正了函数类的例子,因为应用了<或OR >操作符到泛型类型不起作用(与C++模板相同)。
public static class Comparer
{
public static bool IsTrue<T, U>(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
}
}
你能发布一些代码吗?我建议在上面发布一个代码片段。大多数提交都有两个或三个备选方案。有人能格式化这些代码吗?另外,你能给我们多一点代码吗?现在很难看到所有的变化-是否总是反对
移动[检查]
,那么adjust
从何而来?您当前对方法签名的猜测可能会有所帮助。感谢Rob清理了我代码的可见性!“adjust”是一个类变量,我会根据屏幕分辨率和演示程序的计算机对其进行更改。move是一个类的实例数组,在我将使用Xpos而不是YPO的4个代码变体中的2个中。4个变量中也有2个。任何带有>的变量都会在调整变量之前使用a+,反之亦然。另外,一个使用lcac_c.top,一个使用s lcac#U c.对,等等。我希望所有这些都被传递进来。谢谢,我会调查那个网站!这是一个比我更好的答案。在上面的c#示例中,Functor在.Net 2.0中可用吗?我不能让上面的代码工作吗?我需要添加引用吗?不,Functor不是一个标准的.Net类--你需要自己编写它。还有,.Net 2.0不包含Func(它在System.Core.dll .NET 3.5中),因此您需要在其位置使用Syp.Value.Itual C++实际上会使用函数对象而不是函数指针(特别是,这将允许使用<代码> STD:更少< /COD>和其他此类股票函子)。请考虑增加一些细节和解释,以支持你的答案,以帮助他人。
public static class Comparer
{
public static bool IsTrue<T, U>(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.");