2011-01-31 9 views
3

アクションとして条件を別のメソッドに渡したいとします。 「ComputerPriceGenerator」の最初の行は動作しますが、配列work(第2ライン)を作る方法?..私はアドバイスを探しています任意のアイデアC#アクション<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を使用するのに最適な候補者であったであろう、しかしそれは副作用がいっぱいです。私はリファクタリングを検討したいと思います。 –

+1

CalculatePriceとCalculateAllPriceの署名を表示せずに、あなたを助ける方法を知るのは難しいです。 –

+2

@Jon Skeet:「CalculateAllPrice」のシグネチャの内容に関する部分的なアドバイスを探しているようでした。しかし、私は間違っている可能性があります。 –

答えて

10

あなたCalculatePrice方法 - 両方の方法は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); 
+0

それは多くのおかげで働いた – kayak

+0

ジョン、私は未解決の質問があります(この質問はこの1つに関連していない、私はこれを削除します..)、あなたが何か提案があればお知らせください "http://stackoverflow.com/questions/4444972/iterate-a-linq-expression-and-db-into-db-parameter " – kayak

+1

@kayak:そこの答えは私の言うこととほとんど同じです。あなたはほとんど確かにその道を下りたくない。 –

1

に設計されていません配列のすべての要素にメソッドを適用したいので、それを反復処理することはありません。

次のようなPriceMachine.CalculateAllPrice定義することができます。cart.Computersを通じてCalculateAllPrice反復処理を行い、匿名関数にそれぞれ1を渡すその後

public void CalculateAllPrice(IEnumerable<Computer> data, Action<Computer> action) 
{ 
    foreach(Computer c in data) 
    action(c); 
} 
+0

私は同意しますが、メインメソッド「PriceMachine.CalculateAllPrice(cart.Computers、()=> ComputerConverter(??));」から、 – kayak

1
PriceMachine.CalculateAllPrice(cart.Computers, (Computer x) => ComputerConverter(x)); 

を。がちょうどAction、IMO取るべきではない

+1

ビットオーバーキルと思われます。 '(cart.Computers、(Computer x)=> ComputerConverter(x))'は '(cart.Computers、ComputerConverter)'と同じです。 – Juliet

+0

@Juliet:もちろん、私は彼が投稿したラムダスタイルを保っていた。 –