将lambda表达式作为Linq的Count参数时如何确定x的指代
首先我们可以从C#的类型机制、Linq扩展方法的规则两个层面理解这个逻辑:
- 首先
string类型在C#中已经默认实现了IEnumerable<char>接口,本质上就是一个可枚举的字符序列,所以可以直接调用针对IEnumerable<T>封装的Linq扩展方法,包括你用到的Count。 - 你调用的带筛选条件的
Count是泛型扩展方法,它的完整签名是:
public static int Count<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
其中被this修饰的第一个参数source就是调用方法的对象,也就是你的示例里的字符串s,编译器会自动根据s的IEnumerable<char>类型,推导出泛型参数TSource的实际类型是char。
- 方法的第二个参数要求传入一个
Func<TSource, bool>类型的委托,也就是输入一个TSource类型的参数、输出布尔值的方法。你写的x => x == 'h'是符合这个委托要求的lambda表达式,编译器会自动把lambda的输入参数x的类型推导为char,也就是s序列里的每一个元素。
你写的代码和下面的手动循环逻辑是完全等价的:
string s = "hello"; int count = 0; foreach (char x in s) { if (x == 'h') { count++; } }
Linq的Count方法内部就是枚举s的每一个字符,每拿到一个字符就作为参数传入你写的lambda表达式做判断,符合条件就计数加一,所以lambda里的x自然就指代s里的每一个字符元素。
内容的提问来源于stack exchange,提问作者Rudie Kim
相关产品推荐
相关产品推荐

