微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – Linq:执行链查询的顺序

我想了解如何处理链查询.例如,让我们考虑以下查询
var sumOfRoots = numbers           //IEnum0
     .Where(x => x > 0)            //IEnum1
     .Select(x => Math.Sqrt(x))    //IEnum2
     .Select(x => Math.Exp(x))     //IEnum3
     .Sum();

例如,数字= { – 1,4,9}.

这是幕后发生的事情:

1.获得所有普查员(正面通行证)

> numbers调用GetEnumerator()返回(让我们用它来表示)IEnum0实例
> IEnum0调用GetEnumerator(),它返回IEnum1实例
> IEnum1调用GetEnumerator()返回IEnum2实例
> IEnum2调用GetEnumerator()返回IEnum3实例

2.调用MoveNext(向后传递)

> .Sum()在IEnum3上调用MoveNext()
> IEnum3在IEnum2上调用MoveNext()
> IEnum2在IEnum1上调用MoveNext()
> IEnum1在IEnum0上调用MoveNext()

3.从MoveNext返回(前后传球)

> IEnum0移动到元素-1并返回true.
> IEnum1检查-1是否满足条件(这不是真的)所以IEnum1在IEnum0上调用MoveNext().
> IEnum0移动到元素4并返回true.
> IEnum1检查4是否满足条件(为真)并返回true
> IEnum2什么都不做,只返回IEnum1的输出,这是真的
> IEnum2什么都不做,只返回IEnum2的输出,这是真的

4.呼叫当前(向后传球)

> .Sum()在IEnum3上调用Current.
> IEnum3在IEnum2上调用Current
> IEnum2在IEnum1上调用Current
> IEnum1在IEnum0上调用Current

5.回流(前进传球)

> IEnum0返回4
> IEnum1返回4
> IEnum2返回sqrt(4)= 2
> IEnum3返回exp(2)

6.重复步骤2.-5.直到第3步返回false

如果链接查询以不同的方式处理,请更正我.

解决方法

您可以使用委托来了解执行顺序.例:
static void Main(string[] args)
{
    var numbers = new []{ -1,9 };

    double sumOfRoots = numbers.Where(IsGreaterThanZero)   
                               .Select(ToSquareRoot)      
                               .Select(ToExp)              
                               .Sum(x => ToNumber(x));

    Console.WriteLine($"sumOfRoots = {sumOfRoots}");

    Console.Read();
}

private static double ToNumber(double number)
{
    Console.WriteLine($"SumNumber({number})");

    return number;
}

private static double ToSquareRoot(int number)
{
    double value =  Math.Sqrt(number);

    Console.WriteLine($"Math.Sqrt({number}): {value}");

    return value;
}

private static double ToExp(double number)
{
    double value =  Math.Exp(number);

    Console.WriteLine($"Math.Exp({number}): {value}");

    return value;
}

private static bool IsGreaterThanZero(int number)
{
    bool isGreater = number > 0;

    Console.WriteLine($"{number} > 0: {isGreater}");

    return isGreater;
}

输出

-1 > 0: False

4 > 0: True

Math.Sqrt(4): 2

Math.Exp(2): 7.38905609893065

SumNumber(7.38905609893065)

9 > 0: True

Math.Sqrt(9): 3

Math.Exp(3): 20.0855369231877

SumNumber(20.0855369231877)

sumOfRoots = 27.4745930221183

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐