2011-01-31 154 views
3

我想將一個條件作爲Action傳遞給另一個方法。在「ComputerPriceGenerator」第一線工作,但如何使陣列工作(第二行)?..任何想法C#Action <T>,傳遞函數作爲參數

我要找的意見...,CalculateAllPrice沒有設計尚未

public void ComputerPriceGenerator() 
{ 
    //Below line Works 
    PriceMachine.CalculatePrice(cart.Computers[0],() => ComputerConverter(cart.Computers[0]));   
    //How to make this work, i don't want to loop it??? 
    PriceMachine.CalculateAllPrice(cart.Computers,() => ComputerConverter(??)); 
} 

public void ComputerConverter(Computer comp) 
{ 
    if (comp.Memory <= 2) 
     comp.Discount = 10; 
} 
+2

您的代碼將是一個偉大的候選人使用LINQ,但它是完全的副作用。我會考慮重構。 – 2011-01-31 23:52:45

+1

沒有顯示CalculatePrice和CalculateAllPrice的簽名,很難知道如何幫助你。 – 2011-01-31 23:53:14

+2

@Jon Skeet:看起來他似乎正在部分尋找關於「CalculateAllPrice」簽名應該是什麼的建議。雖然我可能是錯的。 – 2011-01-31 23:57:43

回答

10

CalculatePrice方法不應僅舉Action,IMO - 這兩種方法應採取Action<Computer>。所以,我有這樣的方法:

public static void CalculatePrice(Computer computer, Action<Computer> action) 
public static void CalcuateAllPrices(IEnumerable<Computer> computers, 
            Action<Computer> action) 

,並呼籲他們這樣的:

PriceMachine.CalculatePrice(cart.Computers[0], ComputerConverter); 
PriceMachine.CalculateAllPrice(cart.Computers, ComputerConverter); 
1

由於您想將該方法應用於數組的所有元素,因此您不會遍歷它。

您可以定義PriceMachine.CalculateAllPrice這樣:

public void CalculateAllPrice(IEnumerable<Computer> data, Action<Computer> action) 
{ 
    foreach(Computer c in data) 
    action(c); 
} 
1
PriceMachine.CalculateAllPrice(cart.Computers, (Computer x) => ComputerConverter(x)); 

然後讓CalculateAllPrice迭代通過cart.Computers並通過每一個匿名函數。