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实例 2.调用MoveNext(向后传递) > .Sum()在IEnum3上调用MoveNext() 3.从MoveNext返回(前后传球) > IEnum0移动到元素-1并返回true. 4.呼叫当前(向后传球) > .Sum()在IEnum3上调用Current. 5.回流(前进传球) > IEnum0返回4 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; } 输出:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |