【问题标题】:Using lambda expression as a parameter [duplicate]使用 lambda 表达式作为参数
【发布时间】:2021-07-11 12:25:27
【问题描述】:

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

当我们使用 Linq 的Count:

string s = "hello";

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

它怎么知道xs 的元素?

【问题讨论】:

  • 您能澄清一下how does it know x is element of s 的意思吗?你不明白什么是 lambda 表达式吗?你不明白它们是如何在Count() 方法的上下文中使用的吗?你不明白如何枚举字符串吗?
  • 网站上不乏解释 lambda 表达式的信息。见重复。在您的示例中,x 只是 lambda 表示的匿名方法的参数;它“知道”该值,因为调用者,Count() 创建的迭代器,传递值,就像任何调用者将任何值传递给任何其他方法一样。

标签: c# linq lambda count


【解决方案1】:

把它想象成循环遍历集合元素并将给定的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

【讨论】:

    【解决方案2】:

    因为string 实现了IEnumerable&lt;char&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      • 2011-04-18
      • 2017-12-07
      • 2019-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多