为什么在Linq表达式中使用String.contains时,不需要括号?

时间:2018-09-30 05:07:20

标签: c# linq

我在一个编码练习站点上正在阅读一个解决方案,它是用于确定一个句子是否是简谱,而我遇到了这个解决方案:

"abcdefghijklmnopqrstuvwxyz".All(input.ToLower().Contains);

无论出于何种原因,都不需要Contains(),这样编译就可以了。我对LINQ的复杂性还没有足够的经验,所以我想知道是否有人可以回答或指出我的答案。

2 个答案:

答案 0 :(得分:4)

Contains不需要括号的原因是因为您要将函数作为参数传递给All函数,而不是函数的结果。如果查看All的定义,则会看到:

public static bool All<TSource> (this System.Collections.Generic.IEnumerable<TSource> source, 
                                 Func<TSource,bool> predicate);

“全部”正在使用Func<TSource,bool>。在这种情况下,TSourcechar,因此All期望给定参数是对接收字符并返回布尔值的函数的引用-这正是Contains的含义会。

您还可以按照以下方式编写它,它会产生相同的输出(但可能看起来更混乱):(有关差异,请参见下面的@ pinkfloydx33的注释

"abcdefghijklmnopqrstuvwxyz".All(c => input.ToLower().Contains(c));

答案 1 :(得分:0)

首先,您应该查看输入类型。

在这里,All方法接受输入:Func<TSource, bool> predicate

All方法是:public static bool All<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)

Contains方法是:public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value)

现在,我们看到Contains方法是一个与All方法输入谓词相同的委托。 因此,我们将Contains方法作为委托传递,而不是将Contains方法的输出通过All方法传递。

所以,我们应该写:

"abcdefghijklmnopqrstuvwxyz".All(input.ToLower().Contains);

如果我们写:"abcdefghijklmnopqrstuvwxyz".All(input.ToLower().Contains()); 然后它将bool作为All方法的输入返回,这肯定行不通。

但是,如果我们要使用括号,则可以按以下方式使用它:

"abcdefghijklmnopqrstuvwxyz".Contains(input)