Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将运算符与其他参数一起传递_C#_C++_Visual Studio_Delegates - Fatal编程技术网

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

我有一些非常低效的代码,当我使用“”操作和各种变量和常量进行排列时,许多行出现了4次。似乎有一种方法可以编写函数一次,并将运算符与必要的更改值和“ref”变量一起传递。我必须学习什么技巧?有人建议使用“代表”,但我不知道如何以这种方式使用它们。这是在C 2中,VS2005,但是如果该技术是通用的,并且也可以与C++一起使用,那就太好了。 请求一些代码:以下代码以多种形式出现,带有不同的“”符号以及“+”和“-”符号的组合:

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