无法理解方法参数

Having trouble understanding methods parameters

我是 C# 的新手,但开始对 lambda 表达式以及什么是委托及其工作方式有了一些了解。

但是我不是 100% 同意的一件事是如何 "read" 函数参数。

示例。

在我的字符串中,我想拆分数字和字母。我从这个表达式中得到了帮助。

 tempstring = numberBox.Text;
 tempnumber = tempstring.ToCharArray().Where(c => Char.IsDigit(c)).ToString();

我明白它的作用,但是当我看这个方法时 Where()我不知道我在看什么。当我将鼠标悬停在上面时,它会给我这个文本

IEnumerable<char>IEnumerable<char>.Where<char>(Func<char, bool> predicate)(+1 overload)

我不确定要从中得到什么。我在 Func<char, bool> 的参数中知道它需要一个 Char 作为输入,并将给出 boolean 作为输出,但我不知道如何处理其余部分。是否有任何文件可以指导我或可以平均水平解释这一点的人?

正如您已经指出的那样,Where 需要一个谓词,它的输入是一个字符,return 是一个布尔值。

符号 c => Char.IsDigit(c) 是一个 shorthand。这是一个 lambda 表达式,如果 c 是一个数字,它可以被读取为输入 c return true。否则 return false.

这个表达式的左边部分(=>符号之前)是输入,这个表达式的右边部分是输出。

什么是 c

让我们注意这一点,tempstring.ToCharArray()。后者会将tempstring指向的字符串,转换为char的数组。由于数组对象实现了 IEnumerable 接口,您可以使用名为 Where 的扩展方法来过滤数组的元素。写入以下内容:

tempstring.ToCharArray().Where(c => Char.IsDigit(c))

你说只拾取这个数组中的数字字符。所以c对应这个数组中的随机字符

您看到的是一个 Lambda 表达式,您可以在此处找到更多信息: https://msdn.microsoft.com/en-GB/library/bb397687.aspx

您正在向 "Where" 传递一个函数,该函数定义要对构成 Char 数组的项目进行的比较。您声明 "c" 是列表中的项目(char),如果 "c" 与您的比较(bool)匹配,您希望对其进行 returned。

您在本例中提供的布尔值是 "Char.IsDigit(c)"。此比较适用于列表中的每个项目(Char 数组),任何 return 为真的都会 returned 给你。

首先,您必须了解 .Where() 是 .NET 3.5 的 LINQ 扩展方法。它充当 过滤器IEnumerable<T>,在您的情况下,Tchar。所以基本上,你的表达:

tempnumber = tempstring.ToCharArray().Where(c => Char.IsDigit(c)).ToString();

tempstring 转换为 char[](实现 IEnumerable<char>,因此启用了 LINQ)和 过滤 结果序列因此只有 char 满足谓词(Char.IsDigit(c) 返回 true)被返回。最后 ToString() 被调用到结果序列。

用图表表示,考虑何时将 "Foo123" 分配给 tempstring:

          ToCharArray()
"Foo123"        ->      ['F', 'o', 'o', '1', '2', '3']    -> ['F',              'o'   ...              ]     ->  ['1' ,'2', '3']  -> ToString()
   ^                                                           ^                 ^
   |                                                           |                 |
  tempstring                                                Char.IsDigit()    Char.IsDigit()

顺便说一句,因为.Where需要一个Func<char, bool>Char.IsDigit有相同的方法签名,你可以缩短它:

tempnumber = tempstring.ToCharArray().Where(Char.IsDigit).ToString()

无需创建另一个匿名方法来调用 Char.IsDigit

此外,您可以跳过 ToCharArray() 调用,因为 string 已经实现了 IEnumerable<char>。因此,它可以简化为:

tempnumber = tempstring.Where(Char.IsDigit).ToString();