2015-10-14 53 views
2

我对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

https://msdn.microsoft.com/en-us/library/vstudio/bb534803(v=vs.100).aspx – DavidG

+0

@DavidG已经看着它,但我无法真正掌握它。 – Bojje

+0

@Bojje因为你是C#的新手,所以最初假定你必须这样做,并继续学习C#,当你涉及泛型,代表和其他高级功能时,所有的假设都会被清除......但现在假设这是你必须做的事情。 –

回答

2

首先,您必须了解.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(); 
+0

啊哈这就是为什么我要去哪里?如果我想把它变成另一个类型的数组(例如int),我会得到Where Where? – Bojje

+0

@Bojje,'.Where'是一个通用的方法,它接受一个序列('IEnumerable ')和一个谓词('Func '),并返回一个过滤的'IEnumerable '。所以是的,如果你有一个'int'数组,你可以调用'new [] {1,2,3} .Where(x => x <3)'和'.Where'将泛型参数' int'在这里。 – rexcfnghk

+0

Okey。并非所有的预测都是upp,但我会更多地阅读它。非常感谢你做的这些!我会把你作为答案,但已经把它放到另一个答案。但非常感谢你! – Bojje

1

正如您已经指出的那样,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它与这个数组中的随机字符相对应。

+0

是的,但Where 代表什么?和之前的所有其他IEnumerable ? – Bojje

+1

您需要阅读泛型,然后 – DavidG

+0

@DavidG泛型是一些关于强类型参数的权利? IEnumerable 是非泛型和IEnumerable 是一个泛型? – Bojje

0

你所看到的是一个lambda表达式,你可以在这里找到更多的信息: https://msdn.microsoft.com/en-GB/library/bb397687.aspx

要传递到“去哪儿”对构成的内容进行定义的比较函数你的Char数组。你说的是“c”是列表中的项目(char),如果它与你的比较(bool)相匹配,你想要返回“c”。

你在这种情况下提供的布尔是“Char.IsDigit(c)”。此比较应用于列表中的每个项目(Char数组),并且返回true的任何项都会返回给您。