我对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
作为输出,但我不知道如何做其余的。是否有任何文件可以指导我或者能够在平均水平上解释这个问题的人?
答案 0 :(得分:2)
首先,您必须了解.Where()
是.NET 3.5中的LINQ扩展方法。它充当IEnumerable<T>
的过滤器,在您的情况下,T
为char
。所以基本上,你的表达:
tempnumber = tempstring.ToCharArray().Where(c => Char.IsDigit(c)).ToString();
正在使用tempstring
并转换为char[]
(实现IEnumerable<char>
,因此启用了LINQ)和过滤生成的序列,以便仅char
1}}返回谓词(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();
答案 1 :(得分:1)
正如您已经指出的那样,Where
需要一个谓词,它将char作为输入并返回一个bool。
符号c => Char.IsDigit(c)
是此的简写。它是一个lambda表达式,如果c
是一个数字,则可以读取输入c
的返回值。否则返回false。
此表达式的左侧部分(在=>
的符号之前)是输入,此表达式的右侧部分是输出。
什么是c
?
让我们注意这一点tempstring.ToCharArray()
。后者会将tempstring
指向的字符串转换为char
数组。由于数组对象实现了IEnumerable
接口,因此您可以使用名为Where
的扩展方法来过滤数组的元素。写下以下内容:
tempstring.ToCharArray().Where(c => Char.IsDigit(c))
你说只挑选这个数组中的数字字符。所以c
它与此数组中的随机字符相对应。
答案 2 :(得分:0)
您正在查看的是Lambda表达式,您可以在此处找到更多信息: https://msdn.microsoft.com/en-GB/library/bb397687.aspx
您将传递给“Where”一个函数,该函数定义对构成Char数组的项进行的比较。您声明“c”是列表中的项目(char),如果匹配您的比较(bool),则需要返回“c”。
在这种情况下你提供的bool是“Char.IsDigit(c)”。此比较将应用于列表中的每个项目(Char数组),并且任何返回true的项目都将返回给您。