使用多种方法进行委托

本文关键字:方法 | 更新日期: 2023-09-27 18:33:12

我这里有以下示例,应该过滤字符串项目列表

List<string> input = new List<string>() { "cat", "toast", "house" };
Func<string, bool> filter = null;
filter += x => x.EndsWith("t");
filter += y => y.Contains('o');
List<string> output = input.Where(filter).ToList(); //toast, house

我希望结果是"吐司",因为它以 t 结尾并包含 o。但结果是吐司,房子——我的错误是什么?

使用多种方法进行委托

多播委托的返回值是调用列表中最后一个方法的返回值。所以你的 func 只检查给定的参数是否包含 o 并忽略 EndsWith 的结果。

这在C# 5.0 Specification, §15.4 Delegate Invocations中有所说明

调用

其调用列表包含多个条目的委托实例时,将按顺序同步调用调用列表中的每个方法。所调用的每个方法都传递了与提供给委托实例相同的一组参数。[...]如果委托调用包括输出参数或返回值,则其最终值将来自列表中最后一个委托的调用。

如果要检查这两个条件,请使用&&

filter = x => x.EndsWith("t") && x.Contains('o');

过滤器 Func 返回执行的最后一个方法使用此

        List<string> input = new List<string>() { "cat", "toast", "house" };
        Func<string, bool> filter = null;
        filter += x => x.EndsWith("t") && x.Contains('o');