我在一个编码练习站点上正在阅读一个解决方案,它是用于确定一个句子是否是简谱,而我遇到了这个解决方案:
"abcdefghijklmnopqrstuvwxyz".All(input.ToLower().Contains);
无论出于何种原因,都不需要Contains()
,这样编译就可以了。我对LINQ的复杂性还没有足够的经验,所以我想知道是否有人可以回答或指出我的答案。
答案 0 :(得分:4)
Contains
不需要括号的原因是因为您要将函数作为参数传递给All
函数,而不是函数的结果。如果查看All
的定义,则会看到:
public static bool All<TSource> (this System.Collections.Generic.IEnumerable<TSource> source,
Func<TSource,bool> predicate);
“全部”正在使用Func<TSource,bool>
。在这种情况下,TSource
是char
,因此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)