2015-10-14 64 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的任何項都會返回給您。