Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.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# 是否存在表示运算符类型的.NET类?_C#_.net - Fatal编程技术网

C# 是否存在表示运算符类型的.NET类?

C# 是否存在表示运算符类型的.NET类?,c#,.net,C#,.net,我想做以下工作: *OperatorType* o = *OperatorType*.GreaterThan; int i = 50; int increment = -1; int l = 0; for(i; i o l; i = i + increment) { //code } 这个概念可以在javascript中使用eval()来拼凑。。。但这个想法是有一个循环 可以根据运行时设置的值向前或向后移动 这可能吗 谢谢是的,特别是在.NET中,您需要使用。构建表达式树不需要

我想做以下工作:

*OperatorType* o = *OperatorType*.GreaterThan;

int i = 50;

int increment = -1;

int l = 0;

for(i; i o l; i = i + increment)
{
    //code
}
这个概念可以在javascript中使用eval()来拼凑。。。但这个想法是有一个循环 可以根据运行时设置的值向前或向后移动

这可能吗

谢谢

是的,特别是在.NET中,您需要使用。构建表达式树不需要手动完成,编译器将很乐意将它看到的分配给
expression
的任何lambda表达式转换为有效的表达式树

// Creating an expression tree.
Expression<Func<int, int, bool>> greaterThan = (l, r) => l > r;

int i = 50;

int increment = -1;

int l = 0;

for(i; greaterThan(o, i); i = i + increment)
{
    //code
}
//创建表达式树。
表达式大于=(l,r)=>l>r;
int i=50;
整数增量=-1;
int l=0;
对于(i;大于(o,i);i=i+增量)
{
//代码
}

调用表达式树将自动将其编译为动态方法,greaterThan将有效地充当委托。

编辑:添加了一个lambda函数:

Func<int,int,bool> op = (i1, i2) => i1 > i2;
    Func<int, int, bool> lessThan = (num1, num2) => num1 < num2;
    Func<int, int, bool> greaterThan = (num1, num2) => num1 > num2;
    public void Run()
    {
        int increment = -1;
        int l = 0;
        Func<int, int, bool> c = lessThan;
        for (int i = 50; c(i, l); i = i + increment)
        {

        }
    }
Func lessThan=(num1,num2)=>num1num1>num2;
公开募捐
{
整数增量=-1;
int l=0;
Func c=lessThan;
对于(int i=50;c(i,l);i=i+增量)
{
}
}
我相信人们会想出比这更优雅的解决方案,但事实是:

    public enum Comparison
    {
        GreaterThan,
        LessThan
    }
    public bool Compare(int a, Comparison c, int b)
    {
        if (c == Comparison.GreaterThan)
            return a > b;
        else if (c == Comparison.LessThan)
            return a < b;
        else
            throw new ArgumentException();
    }

    public void Run()
    {
        int i = 50;
        int increment = -1;
        int l = 0;
        Comparison c = Comparison.GreaterThan;
        for (i; Compare(i, c, l); i = i + increment)
        {

        }
    }
公共枚举比较
{
比,
莱斯坦
}
公共布尔比较(整数a、整数c、整数b)
{
if(c==Comparison.GreaterThan)
返回a>b;
else if(c==Comparison.LessThan)
返回a
Func o=(x,y)=>x>y;
int i=50;
整数增量=-1;
int l=0;
对于(;o(i,l);i=i+增量)
{
//代码
}
或者干脆除掉我:

        Predicate<int> o = (x) => x > 0;

        int i = 50;

        int increment = -1;

        for(; o(i) ; i = i + increment)
        {
            //code
        }
谓词o=(x)=>x>0;
int i=50;
整数增量=-1;
对于(;o(i);i=i+增量)
{
//代码
}

您可以定义自己的类并实现自己的运算符,请参见

--已编辑

哦,误解了你的意思,最好的方法是像Andrey sad那样使用expression或Func。

使用expression而不仅仅是普通Func委托的原因是什么?使用Func只会创建一个绑定到委托的匿名函数。它将在编译时构造。另一方面,将lambda分配给表达式会导致编译器发出一个表达式树,该表达式树可以在运行时进行操作。无法使用匿名方法。
        Func<int, int, bool> o = (x, y) => x > y;

        int i = 50;

        int increment = -1;

        int l = 0;

        for(; o(i, l) ; i = i + increment)
        {
            //code
        }
        Predicate<int> o = (x) => x > 0;

        int i = 50;

        int increment = -1;

        for(; o(i) ; i = i + increment)
        {
            //code
        }