在c#中没有参数的方法仍然是一种方法?

时间:2013-07-01 12:26:17

标签: c# visual-studio-2010 .net-4.0 .net-4.5

我要做的就是检查列表B的所有元素是否在列表A

        if (listA.All(element => listB.Contains(element))
        {
            return;
        }

有人想出了另一个解决方案,说这会起作用并且有效!

       if (listA.All(listB.Contains))
            return;

现在,(我知道它有效),

  1. 为什么编译器在第二种方法中不需要a()near contains?
  2. 如果将来比如说我想要比较不区分大小写的话,我该如何用第二种方法来做呢?
  3. 提前致谢。

1 个答案:

答案 0 :(得分:13)

All方法要求将谓词作为参数:Func<T, bool>其中TList<T>中的项目属于同一类型。此代码有效,因为它提供了这样的方法。 All方法将返回一个值,该值指示在列表中的每个项目上调用提供的谓词的结果是否为true。该参数是Contains方法的引用,它与所需的Func<T, bool>匹配,只需一个参数T并返回bool

考虑以下两行代码:

Func<string, bool> predicate1 = s => s.Length > 5;
Func<string, bool> predicate2 = listB.Contains;

这两行都有效,因为赋值运算符右侧的表达式求值为采用单个string参数的方法,并返回bool。您可以将predicate1predicate2传递到All方法。它与您提供的代码相同,只是谓词是直接传递的,而不是先存储在变量中并传入变量。

Contains方法实际上并未作为参数调用。它仅由All方法在内部调用。

如果您想进行不区分大小写的搜索,使用与上面相同的语法,则需要一个执行不区分大小写搜索的方法。您可以随时使用自定义匿名方法:

listA.All(x => listB.Any(
    z => string.Equals(x, z, StringComparison.OrdinalIgnoreCase)));