无法理解方法参数
我对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
小号满足谓词(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();
正如您已经指出的那样,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
要传递到“去哪儿”对构成的内容进行定义的比较函数你的Char数组。你说的是“c”是列表中的项目(char),如果它与你的比较(bool)相匹配,你想要返回“c”。
你在这种情况下提供的布尔是“Char.IsDigit(c)”。此比较应用于列表中的每个项目(Char数组),并且返回true的任何项都会返回给您。
https://msdn.microsoft.com/en-us/library/vstudio/bb534803(v=vs.100).aspx – DavidG
@DavidG已经看着它,但我无法真正掌握它。 – Bojje
@Bojje因为你是C#的新手,所以最初假定你必须这样做,并继续学习C#,当你涉及泛型,代表和其他高级功能时,所有的假设都会被清除......但现在假设这是你必须做的事情。 –