gpt4 book ai didi

c# - LINQ 的 Func 只调用一次?

转载 作者:IT王子 更新时间:2023-10-29 04:26:34 25 4
gpt4 key购买 nike

我不知道要用谷歌搜索什么关键字...任何人都可以给我指一个 MSDN 页面或 SO 答案来解释为什么 Foo() 只被调用一次吗?特别是 First 只有一个带有谓词的重载。这里进行了哪些优化?

using System;
using System.Linq;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var foo = "Foo".First(Foo().Contains); // x 1
var bar = "Bar".First(c => Bar().Contains(c)); // x 3
var baz = "Baz".First(c => { return Baz().Contains(c); }); // x 3

Console.ReadLine();
}

private static string Foo()
{
Console.WriteLine("Foo");
return "__o";
}

private static string Bar()
{
Console.WriteLine("Bar");
return "__r";
}

private static string Baz()
{
Console.WriteLine("Baz");
return "__z";
}
}
}

编辑:

除了接受和赞成的答案(谢谢)之外,通过 ILSpy 运行它也帮助我从视觉上理清顺序。

private static void Main(string[] args)
{
char foo = "Foo".First(new Func<char, bool>(Program.Foo().Contains<char>));
char bar = "Bar".First((char c) => Program.Bar().Contains(c));
char baz = "Baz".First((char c) => Program.Baz().Contains(c));
Console.ReadLine();
}

最佳答案

Foo()只被调用一次,因为你传递给 First() 的表达式是Foo().Contains .

要计算此表达式,Foo()只需调用一次。

让我们考虑一下第一个和第二个片段之间的区别:

"Foo".First(Foo().Contains);

在这里,First()期望一个 Func<char, bool>争论。 Foo()被称为(一次)和成员访问 Contains对结果执行。该成员访问的结果确实是一个 Func<char, bool> , 所以代码是有效的并且该委托(delegate)被传递给 First() , 它继续为 "Foo" 中的每个字符调用它.请注意,我们已完成调用 Foo()在这里,因为调用委托(delegate)并不意味着我们必须评估 Foo()再次。

"Bar".First(c => Bar().Contains(c));

在这里,Func<char, bool>传递给 First()是 lambda 表达式 c => Bar().Contains(c) . First()将继续为 "Bar" 中的每个字符调用该委托(delegate). lambda 表达式的“主体”在每次调用时执行,结果为 Bar()被调用三次。

关于c# - LINQ 的 Func<bool> 只调用一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28174159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com