【问题标题】:Method with no parameters in c# and still a method?c#中没有参数的方法仍然是方法吗?
【发布时间】:2013-07-01 12:26:16
【问题描述】:

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

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

有人提出了另一种解决方案,说这行得通,而且行得通!

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

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

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

提前致谢。

【问题讨论】:

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


    【解决方案1】:

    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)));
    

    【讨论】:

    • 具体来说,一个Func&lt;T, bool&gt;类型的谓词
    • 谢谢丹。如果将来,比如说,我希望这个比较不区分大小写,我将如何使用第二种方法?
    • @Dan:感谢 Dan.. 的编辑。但是,“此代码有效,因为它提供了这样的方法”这句话仍然意味着什么?另外,您能帮我解释一下“listB.Contains”吗?
    • @Dan:有点……但是,我可以理解“Func”是必须提供给“All”方法的参数。但是 listB.Contains 是否扩展为“Func”?
    猜你喜欢
    • 2012-07-20
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2010-12-15
    • 2018-02-21
    相关资源
    最近更新 更多