2014-09-05 90 views
1

我正在學習LINQ,我發現這個例子。Linq如何傳遞參數

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; 

var numsInPlace = numbers.Select((num, index) => new { Num = num, InPlace = (num == index) }); 

Console.WriteLine("Number: In-place?"); 
foreach (var n in numsInPlace) 
{ 
    Console.WriteLine("{0}: {1}", n.Num, n.InPlace); 
} 

我不明白下面的行執行:

var numsInPlace = numbers.Select((num, index) => new { Num = num, InPlace = (num == index) }); 

按我的理解numindex是參數,但我不明白的地方,我們決定,第一個參數將是一個數字和第二個參數是數字的索引?

這是固定的int類型的數組?

有人能幫我理解嗎? 在此先感謝。

+1

[Linq-索引選擇]的可能重複(http://stackoverflow.com/questions/19853315/linq-indexed-select) – Storm 2014-09-05 12:36:40

回答

3

方法Select的定義決定它。 Select有至少2個定義,一個說明需要Func<MyInput,int,MyReturn>。我們知道Func的最後一個generic parameter都是輸入,而最後一個是輸出。 Func是一種特殊類型的對象(委託類型),它有一個名爲Invoke()的方法來運行它,還有一個特殊的語法 - 糖 - 簡寫(),它說你可以省略Invoke並只寫()

Func<object, int> d = x => 1 
d.Invoke(null) // will always return 1 
d(new Object()) // also the same 

enter image description here

所以編譯器把你的功能,並試圖找到選擇的一個,可以接受這樣的功能。然後編譯。然後,在運行時,Select只需從集合中獲取第一個,第二個等元素,並通過傳遞元素(如果選擇了使用接受索引的函數的Select重載的索引)來運行您的函數。

+1

如何擴展超載列表? – 2014-09-05 12:56:33

+1

在這種情況下,我有一個ReSharper。這是相當常用的工具。對不起,我甚至不能告訴你它是如何在沒有Resharper的情況下工作的。 提示:當正確的位置顯示文本光標時,Ctrl +空格鍵通過顯示彈出窗口和信息有很大幫助。 – doker 2014-09-05 12:57:52

+0

謝謝,我得檢查一下。 – 2014-09-05 12:59:00

-1

(num,index,TResult)=> new {....}是Func委託類型的匿名函數。它由.Net Framework定義。因此,第一個參數是一個對象,其中第二個參數是數組中對象的索引。

Func<T, Index, TResult> Delegate 

將Func翻譯成英文的方法是:「一種將數組中的T和索引T取反並返回TResult的方法。

還有一件事叫做行動委託,那裏沒有回報。

請必須把這個鏈接引用: http://simpleprogrammer.com/2010/09/24/explaining-what-action-and-func-are/

+0

它爲什麼是-1?我認爲管理員需要在這裏看到傲慢的開發者...... – codebased 2014-09-08 12:02:02

-1

看到這個link

選擇器的第一個參數表示要處理的元素。選擇器的第二個參數表示源序列中該元素的從零開始的索引。例如,如果元素按已知順序排列,並且您想在特定索引處使用某個元素執行某些操作,則這可能很有用。如果您想檢索一個或多個元素的索引,它也會很有用。