无法理解方法参数
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>
,在您的情况下,T
是 char
。所以基本上,你的表达:
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();
我是 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>
,在您的情况下,T
是 char
。所以基本上,你的表达:
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();