使用 lambda 表达式作为参数

问题描述

我试图将 lambda 表达式 理解为参数

当我们使用 Linq 的 Count 时:

string s = "hello";

int count = s.Count(x => x == 'h');

它如何知道 xs 的元素?

解决方法

把它想象成循环迭代集合的元素并将给定的lamba应用到每个元素:

var count = 0;
foreach(var x in s)
    if(x == 'h')
        count++;

或使用 lambda 表达式:

Func<char,bool> predicate = (c) => c == 'h';
var count = 0;
foreach(var x in s)
    if(predicate(c))
        count++;

这里是 LINQ Count 方法的源代码:

public static int Count<TSource>(this IEnumerable<TSource> source,Func<TSource,bool> predicate)
{
    if (source == null)
    {
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
    }

    if (predicate == null)
    {
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.predicate);
    }

    int count = 0;
    foreach (TSource element in source)
    {
        checked
        {
            if (predicate(element))
            {
                count++;
            }
        }
    }

    return count;
}

因此您可以看到它与之前的实现几乎相同,但它使用通用参数 TSource 而不是硬编码的 char

,

因为 string 实现了 IEnumerable<char>

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...