2015-09-20 50 views
-2

例1:如何C#使用持續傳遞的風格和總結

void Main() 
{ 
    var seq = new int[] {-4,-3,0,1,2,3,4,}; 
    var res = seq.Aggregate(0, (a,s) => s >= 0? a+1 : a-1); 
} 

任何人都可以解釋一下什麼是0, (a,s)=> s >= 0? a + 1:a-1的意思是在Aggregate()

實施例2:

void Main() 
{ 
    Func<int,int> H = null; 
    H = n=> n<=1 ? 1 : 2*H(n-1)+1; 
    int x = H(3) + H(5); 
} 

,什麼N =>Ñ< = 1?1:2 * H(N-1)+1手段?爲什麼在n的左邊有一個「=>」,在n的右邊是「< =」? 「:」符號是什麼意思?什麼是「?」標記的意思?

+0

這可能是更好的使用具有可讀的名稱時習樣本...還可以閱讀有關每個在C#中的基本運營商挖掘到拉姆達前也就是說詢問「C#中的含義」是否會給你帶來低估... –

回答

3

seq.Aggregate(0,(a,s)=>s>=0?a+1:a-1);中,第一個參數(0)是種子值。第二個參數是一個lambda表達式,它指定將爲序列中的每個元素運行的委託(一種方法)。方法Aggregate將從種子(在這種情況下爲0)開始,並添加處理序列中每個元素所得到的結果。這裏是一個可以讓你發生了什麼更好的主意更長的等價形式:

static void Main(string[] args) 
{ 
    var seq = new int[] { -4, -3, 0, 1, 2, 3, 4, }; 
    var res = seq.Aggregate(0, (a, s) => Calculate(a, s)); 
} 

private static int Calculate(int a, int s) 
{ 
    int returnValue = s >= 0 ? a + 1 : a - 1; 
    return returnValue; 
} 

我建議你把斷點在代碼中(無論是在你的樣品中或在我的第二個更詳細的形式的代碼)以更好地理解發生了什麼。

在第二個示例中Func<int,int>是委託類型。 In line
Func<int, int> H = null;
您正在聲明一個變量H,它是一個方法委託類型,它接受一個int輸入參數並返回一個int結果。在下一行:
H = n => n <= 1 ? 1 : 2 * H(n - 1) + 1;
您正在爲H分配一個lambda表達式(實際上是將一個委託方法分配給H)。在下一行上:
int x = H(3) + H(5);
您將x分配給x表達式,並在其中調用H兩次。見下面是一個更詳細的等價形式,可以更好地解釋發生了什麼。
請注意,H的這個特定實現是遞歸方法。這個方面也更容易看到更詳細的形式。需要注意的是方法Calculate自稱:

private static void Main(string[] args) 
{ 
    Func<int, int> H = null; 
    H = Calculate; // Note that Calculate is not invoked here yet 

    int x = H(3) + H(5); 
} 

private static int Calculate(int input) 
{ 
    int output = input <= 1 ? 1 : 2 * Calculate(input - 1) + 1; 
    return output; 
} 

private static int Calculate(int input) 
{ 
    if (input <= 1) 
    { 
     return 1; 
    } 
    else 
    { 
     return 2 * Calculate(input - 1) + 1; 
    } 
} 
1

從總數0開始,遍歷seq,並在每個元素上調用(a, s) => s == 0 ? a + 1 : a - 1,將調用結果添加到總和中。因此,第一次調用會將第一個元素的值+ 1加到總和中,其他所有調用都會將元素的值 - 1加到總和中。

至於其他問題,查找lambda表達式和三元語句。