在理解方法参数方面有困难
本文关键字:方面 参数 方法 | 更新日期: 2023-09-27 18:17:32
我对c#有点陌生,但开始对lambda表达式和委托是什么以及它们是如何工作的有所了解。
但是有一件事我不是100%理解,那就是如何"读取"函数的参数。
的例子。
在一个字符串中,我想把数字和字母分开。我从这个表达式中得到了帮助。
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()
是来自。net 3.5的LINQ扩展方法。它充当IEnumerable<T>
的过滤器,在您的示例中,T
是char
。所以基本上,你的表达式:
tempnumber = tempstring.ToCharArray().Where(c => Char.IsDigit(c)).ToString();
取tempstring
并转换为char[]
(它实现了IEnumerable<char>
,因此启用了linq),并过滤结果序列,以便只返回满足谓词(Char.IsDigit(c)
返回true
)的char
。最后,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();
正如您已经指出的那样,Where
期望一个谓词,该谓词将获取一个char作为输入并返回一个bool。
符号c => Char.IsDigit(c)
是它的简写。这是一个lambda表达式,它可以被理解为如果c
是一个数字,则输入c
返回true。否则返回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),并且如果它与您的比较(bool)匹配,则希望返回"c"。
本例中提供的bool值是"Char.IsDigit(c)"。这个比较应用于列表(Char数组)中的每一项,任何返回true的都会返回给您。