gpt4 book ai didi

c# - 将已编译的 Func 方法添加在一起的目的是什么?

转载 作者:太空狗 更新时间:2023-10-29 19:59:54 25 4
gpt4 key购买 nike

我看到可以将已编译的方法添加到一起。

Expression<Func<Customer, bool>> ln = c => c.lastname.Equals(_customer.lastName, StringComparison.InvariantCultureIgnoreCase);
Expression<Func<Customer, bool>> fn = c => c.firstname.Equals(_customer.firstName, StringComparison.InvariantCultureIgnoreCase);
Expression<Func<Customer, bool>> fdob = c => c.DOB.ToString("yyyyMMdd").Equals(_customer.DOB.ToString("yyyyMMdd"));

var filter = ln.Compile() + fn.Compile() + fdob.Compile();

这样做有意义吗?

我打算使用过滤器代替 lambda 表达式来过滤客户存储库:

IEnumerable<Customer> customersFound = _repo.Customers.Where(filter);

根据业务逻辑,我可能会也可能不会将这三个编译方法一起添加,但是我会挑选并可能添加更多编译方法。

谁能解释一下将它们加在一起是否会构成一个查询字符串?谁有更好的建议?

我可以链接“Where”语句并使用常规的 lambda 表达式,但我很想知道您可以从编译方法并将它们相加中获得什么!

最佳答案

这是 Compile 的副作用方法返回一个委托(delegate)。

在内部,委托(delegate)是一个多播委托(delegate),它可以涉及对方法的多个链接引用。

在这种情况下,+ 只是一种将它们链接在一起的快速方法。您可以在 How to: Combine Delegates 中阅读更多关于合并代表的信息。在 MSDN 上。

这是一个 LINQPad演示的程序:

void Main()
{
var filter = GetX() + GetY() + GetZ();
filter().Dump();
}

public int X() { Debug.WriteLine("X()"); return 1; }
public int Y() { Debug.WriteLine("Y()"); return 2; }
public int Z() { Debug.WriteLine("Z()"); return 3; }

public Func<int> GetX() { return X; }
public Func<int> GetY() { return Y; }
public Func<int> GetZ() { return Z; }

输出:

X()
Y()
Z()
3

请注意,它因此似乎只是忽略了第一个方法调用的返回值,而只返回最后一个方法,尽管它也完全调用了先前的方法。

请注意,上面的代码与此类似:

void Main()
{
Func<int> x = X;
Func<int> y = Y;
Func<int> z = Z;

var filter = x + y + z;
filter().Dump();
}

public int X() { Debug.WriteLine("X()"); return 1; }
public int Y() { Debug.WriteLine("Y()"); return 2; }
public int Z() { Debug.WriteLine("Z()"); return 3; }

因此,简短的回答是,不,这不会执行您希望它执行的操作。

关于c# - 将已编译的 Func 方法添加在一起的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15721993/

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