2012-06-20 25 views
3

我得到了一個調用函數的代碼,直到滿足條件,但是我並沒有處於非常先進的階段,所以我對代碼一點都不清楚。在這裏我將提交我得到的代碼...請有人討論代碼如何工作的細節。調用一個函數,直到在C中遇到一個條件爲止#

public static void RunToFirstMatch<T>(Func<T, bool> sentry, params Func<T>[] functions) 
{ 
    functions.Any(f => match(f())); 
} 

的代碼被稱爲如下

RunToFirstMatch(v => (v >= 5), Step1,()=>Step2(1,1), Step3, Step4,()=>0+1); 

RunToFirstMatch功能需要2的說法,但在獲取調用這個函數,那麼許多參數傳遞....我只是不明白有關調用函數。請討論謝謝。

+0

我在這裏看到的另一種相同的方法http://www.codeproject.com/Tips/174241/Call-Functions-Until-One-Meets-Condition它不是也很清楚。 – Thomas

+0

我想你在函數中混入了參數名稱。 '哨兵'應該是'匹配'或反之亦然 – sloth

回答

2

第二個參數params Func<T>[] functions實際上的含義是「允許多個Func<T>作爲後續參數傳遞,並將它們呈現在名爲functions的數組中。」這是由params keyword引起的。

因此,當你調用

RunToFirstMatch(v => (v >= 5), Step1,()=>Step2(1,1), Step3, Step4,()=>0+1) 

sentry = v => (v >= 5); /* or should this be called match? */ 
functions = new Func<T>[] 
    { 
     Step1, 
     ()=>Step2(1,1), 
     Step3, 
     Step4, 
     ()=>0+1 
    }; 
5

有幾個部分這一點,我可以看到爲什麼新手可能會發現這個代碼有點難以理解。

首先,該方法不採取2個參數,所述第二被標記params這意味着任何數量的參數傳遞給該方法,與所有但第一個被髮送作爲數組的說法functions(進一步閱讀在the C# params keyword)。

接着,該方法使用IEnumerable<T>擴展方法Any其中列舉任何枚舉(如參數functions),直到所述方法的一個返回true。

我想,那麼你有一些參數混合起來,我覺得你變了sentrymatch,並作出這樣的假設會發生什麼情況是,從陣列functions每個函數執行,並將結果傳遞給match功能(這將返回true或false)。第一個返回true的方法退出。

因此,通過示例的方式,大致根據自己:

RunToFirstMatch(v => (v >= 5), // match 
       () => 1,() => 4,() => 9,() => 20,() => 40); //function(s) 

步驟1,2 & 3將執行(圖3是第一返回false),然而4 & 5不會。

+1

不會3?它必須運行它來查看它是否匹配。 – Rawling

+1

@Rawling - 該死的你和你的邏輯。 – Jamiec

3

我認爲這是在代碼中的輕微錯誤,因爲我認爲它應該是

public static void RunToFirstMatch<T>(Func<T, bool> sentry, params Func<T>[] functions) 
{ 
    functions.Any(f => sentry(f())); 
} 

但讓我們一步一步來:

哨兵是決定基於它的謂詞的輸入(中類型T) - 如果某件事情是真的 - 這是你給函數的第一件事 - 在你的例子中這是v >= 5 - 所以我想它會採用一個int(在你的例子中不清楚 - 例如可能是一個double)和檢查它是否更大5

下一頁你得到了一個參數數組的函數,每個給你這樣的T 參數數組是爲什麼你可以給多個函數。

Any是一個很好的技巧:這將通過您提供的函數(在param數組中),對它們進行評估,然後檢查結果。如果哨兵說任何停止都是正確的,那麼這個函數就完全按照它所說的去做。

相關問題