4

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

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

有人想出了另一种解决方案,说这可行并且可行!

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

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

  1. 为什么编译器在第二种方法中不需要 () 附近包含?
  2. 如果将来,比如说,我希望这个比较不区分大小写,我将如何使用第二种方法呢?

提前致谢。

4

1 回答 1

13

All方法要求一个谓词作为参数:Func<T, bool>其中T相同类型的项目是List<T>. 这段代码之所以有效,是因为它提供了这样一种方法。该All方法将返回一个值,该值指示对列表中的每个项目调用提供的谓词的结果是否导致true. 参数是对与 required 匹配的方法的引用,采用单个参数并返回一个.ContainsFunc<T, bool>Tbool

考虑这两行代码:

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

这两行都有效,因为赋值运算符右侧的表达式计算为采用单个string参数并返回 a 的方法bool。您可以传递predicate1predicate2进入该All方法。和你提供的代码一样,只是谓词是直接传递的,而不是先存入变量,再传入变量。

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

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

listA.All(x => listB.Any(
    z => string.Equals(x, z, StringComparison.OrdinalIgnoreCase)));
于 2013-07-01T12:28:37.300 回答