代表有多种方法

时间:2014-12-05 14:00:13

标签: c# delegates

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

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

我希望结果是&#34;吐司&#34;因为它以t结尾并包含o。但结果是烤面包,房子 - 我的错误是什么?

2 个答案:

答案 0 :(得分:1)

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

这在C# 5.0 Specification, §15.4 Delegate Invocations

中说明
  

通过按顺序同步调用调用列表中的每个方法来调用其调用列表包含多个条目的委托实例。所谓的每个方法都传递给委托实例的相同参数集。[...] 如果委托调用包含输出参数或返回值,则它们的最终值将来自最后一个的调用代表在列表中。

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

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

答案 1 :(得分:0)

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

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